代码之家  ›  专栏  ›  技术社区  ›  bopapa_1979

MVC对浏览器的即时响应?

  •  4
  • bopapa_1979  · 技术社区  · 14 年前

    再次,向MVC noob提问。原谅我缺乏经验。

    我有一个使用MVC路由返回大型XML文件的情况。有时它会很大。目前,我正在使用StringBuilder构建我想要的XML输出,然后按如下方式返回:

    var sb = new StringBuilder();
    XmlObject.WriteXml(sb);
    return Content(sb.ToString(), "text/xml", Encoding.UTF8);
    

    在XmlObject.WriteXml()方法中,调用了大量其他小方法,这些方法在调用时输出XML的位和片段,因此我立即开始构建XML字符串,只需要一段时间就可以完成。这些方法中的每一个都接受一个StringBuilder作为参数,因此可以创建一个并到处传递它,在每个小方法中使用sb.Append()来构建最终的XML blob。

    好的,所以我想做的是,一旦字符串开始构建,就开始返回一些东西给客户机。在Webforms中,我会用HttpResponse替换所有StringBuilder参数,并使用HttpResponse.Write()而不是StringBuilder.Append(),其方式类似于:

    this.Response.BufferOutput = false;
    XmlObject.WriteXml(Response);
    

    然后,当每个XML片段被写入响应时,文本将被发送到客户端。

    我遇到的问题是ActionResult必须有一个return语句。我不知道如何用MVC路由和ActionResult来处理类似的问题。也许我需要使用的不是ActionResult?

    谢谢大家!

    5 回复  |  直到 14 年前
        1
  •  2
  •   Wyatt Barnett    14 年前

    如果它不需要是MVC操作的结果,并且您不想破坏那里的可测试性/封装性,那么您可以按照我们一贯的方式来完成它——使用一个定制的IHttpHandler直接流到响应中。

    更新

    也就是说,现在我正在阅读你所做的,我个人会采取“离线构建并合理缓存”的角度,而不是担心流媒体。处理罐装食品可能比处理活食品容易。

        2
  •  4
  •   SLaks    14 年前

    您可以将操作方法更改为返回 void
    (这是可能的;我试过了)

        3
  •  2
  •   Drew Noakes    13 年前

    使用 StringBuilder 会给你的记忆带来很大的压力。如果您可以按深度第一顺序编写XML,请使用 XmlTextWriter

    下面是一些将大量XML写入输出流的示例代码:

    public ActionResult SiteMap()
    {
        Response.ClearContent();
        Response.ContentType = "application/xml";
        Response.ContentEncoding = Encoding.UTF8;
    
        using (var context = new MyDataContext())
        {
            using (var xml = new XmlTextWriter(Response.Output))
            {
                xml.WriteStartElement("urlset",
                                      "http://www.sitemaps.org/schemas/sitemap/0.9");
    
                var url = new UrlHelper(Request.RequestContext);
    
                xml.WriteStartElement("url");
                xml.WriteElementString("loc", /* some URL */);
                xml.WriteEndElement();
    
                foreach (var blogPost in context.BlogPosts)
                {
                    xml.WriteStartElement("url");
                    xml.WriteElementString("loc", /* blog post URL */);
                    xml.WriteEndElement();
                }
    
                xml.WriteEndElement();
                xml.Flush();
            }
        }
    
        return null;
    }
    

    这个特定的例子是我用来写出 sitemap.xml 文件。在我的例子中,文档有大约30000个url,大小约为250万b。

        4
  •  0
  •   Phil Winkel    14 年前
    public ActionResult Xml()
    {
        string xmlString = "xml goes here...";
        return this.Content(xmlString, "text/xml", Encoding.UTF8);
    }
    

    我不知道你在说什么,听起来你想做某种异步http请求。一般来说,它们不是。客户端发送一个http请求,服务器生成并返回一个响应。

        5
  •  0
  •   CatDadCode    14 年前

    您总是可以先加载页面并显示友好的内容,然后使用AJAX调用一个完成脏工作的操作方法。