Asp.net mvc MVC即时响应浏览器?

Asp.net mvc MVC即时响应浏览器?,asp.net-mvc,asp.net-mvc-routing,httpresponse,actionresult,Asp.net Mvc,Asp.net Mvc Routing,Httpresponse,Actionresult,再次询问MVC noob问题。原谅我缺乏经验 有一种情况是,我使用MVC路由返回一个大的XML文件。有时它可能非常大。目前,我正在使用StringBuilder构建我想要的XML输出,然后像这样返回它: var sb = new StringBuilder(); XmlObject.WriteXml(sb); return Content(sb.ToString(), "text/xml", Encoding.UTF8); 我遇到的是,由于各种原因,XML博客可能需要相当长的时间才能生成 在X

再次询问MVC noob问题。原谅我缺乏经验

有一种情况是,我使用MVC路由返回一个大的XML文件。有时它可能非常大。目前,我正在使用StringBuilder构建我想要的XML输出,然后像这样返回它:

var sb = new StringBuilder();
XmlObject.WriteXml(sb);
return Content(sb.ToString(), "text/xml", Encoding.UTF8);
我遇到的是,由于各种原因,XML博客可能需要相当长的时间才能生成

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

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

this.Response.BufferOutput = false;
XmlObject.WriteXml(Response);
然后,当每一小段XML被写入响应时,文本将被发送到客户端

我遇到的问题是ActionResult必须有一个返回语句。我不知道如何使用MVC路线和ActionResult以类似的方式进行处理。也许我需要使用的不是ActionResult


谢谢大家

您可以更改操作方法以返回void,然后直接写入响应。 这是可能的;我试过了

public ActionResult Xml()
{
    string xmlString = "xml goes here...";
    return this.Content(xmlString, "text/xml", Encoding.UTF8);
}

可能想考虑缓存Actuple结果,如果您不想在每个请求上重新生成它。查看[OutputCache]属性,您可以按参数将其缓存指定的时间等


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

您始终可以先加载页面并显示友好内容,然后使用AJAX调用执行脏工作的操作方法。

如果它不需要是MVC操作的结果,你不想破坏可测试性/封装性,你可以像我们以前做的那样,用一个定制的IHttpHandler直接流到响应中

更新

示例可能没有意义-您的问题中已经有了概念。唯一的方法是跳过StringBuilder,并使用设置为stream的XmlTextWriter跳过中间人


也就是说,现在我正在阅读您正在做的事情,我个人会将构建脱机并缓存,而不是担心流式处理。处理罐装文档可能比处理实时文档更容易。

使用StringBuilder构建大量XML会给内存带来很大压力。如果可以按深度优先顺序编写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文档的XML内容的一些代码的缩写版本。在我的例子中,文档大约有30000个URL,大小约为2.5MB。

整个结果是XML。没有页面。啊,我看错了,无视我的评论。嗯,现在我也很好奇如何做到这一点。我正在构建一个XML站点地图。一个非常复杂的问题。有必要跨多个数据库发出大量小型数据库请求。在许多情况下,我最终获得了开始构建XML字符串和发出下一个数据库请求所需的信息。我更喜欢开始喂谷歌,雅虎,必应等。。。我使用了ContentResult,但不幸的是,当我设置UTF8编码时,我总是得到encoding=utf-16:有点疯狂,并且肯定破坏了封装,但考虑到其他选项,这不是一个可怕的想法-比如自定义IHttpHandler。我会非常兴奋地看到任何这样的例子,如果你有一个躺在那里,你可以在这里切割和下降。谢谢你的想法虽然。。。我想沿着那条路走一段路,这就成功了。快点,谢谢!最后,我在自定义处理程序中使用XmlTextWriter,并缓存输出:。谢谢看见