如何在 ASP.net MVC 4 中将文本流式传输到浏览器?

Dan*_*don 3 asp.net asp.net-mvc streaming asp.net-mvc-4

我试图弄清楚如何让 ASP.net MVC 4 在长时间运行的操作期间将数据发送回浏览器。因为我以前从未这样做过,所以我从一个简单的例子开始:

public void Index()
{
    Response.Write("<p>Hello, world! Counting to 5!</p>");
    for (int i = 0; i < 5; i++)
    {
        Thread.Sleep(1000);
        Response.Write("<p>" + i + "</p>");
        Response.Flush();
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这段代码应该立即发送“你好,世界!数到 5!” 到浏览器,然后每秒发送一位,直到达到五。

但是,当我运行此代码时,它需要五秒钟的时间,并且所有文本都会一次输出。

我认为 Response.Flush() 方法应该允许您以增量方式将数据发送到浏览器。

我怎样才能使这项工作?

Dan*_*don 5

我找到了我的问题的答案。

首先,如果 Internet Explorer 没有看到文档是有效的 HTML,它似乎不会流式传输文本。我添加了代码来打印出围绕我的数据的准系统 HTML 页面,这似乎使它起作用了。

另一位作者在这里写道:http : //encosia.com/easy-incremental-status-updates-for-long-requests/ Internet Explorer 会自动缓冲输入的前 256 个字符,因此建议放入 256 个字符的 throw-一开始就删除数据,但这似乎对我正在使用的版本(IE 10)没有影响。

最后,我只数到四,因为我差一分;-)

这是我的工作代码:

public void Index()
{
    Response.Write("<!DOCTYPE html><html><head><title>Test</title></head><body>");

    Response.Write("<!--");
    Response.Write(new string('*', 256));            
    Response.Write("-->");
    Response.Flush();

    Response.Write("<p>Hello, world! Counting to 5!</p>");
    for (int i = 1; i <= 5; i++)
    {
        Response.Flush();
        Response.Write("<p>" + i + "</p>");                
        Thread.Sleep(1000);
    }
        Response.Write("</body></html>");
}
Run Code Online (Sandbox Code Playgroud)