3

長時間の操作中に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();
    }
}

このコードは、すぐに「Hello, world! Counting to 5!」を送信する必要があると思います。ブラウザに送信し、その後 5 桁になるまで 1 秒ごとに 1 桁ずつ送信します。

しかし、このコードを実行すると、5 秒かかり、すべてのテキストが一度に出力されます。

Response.Flush() メソッドを使用すると、ブラウザにデータを段階的に送信できるようになるはずだと思いました。

どうすればこれを機能させることができますか?

4

1 に答える 1

5

私は自分の質問に対する答えを見つけました。

まず第一に、ドキュメントが有効な HTML であると見なされない場合、Internet Explorer はテキストをストリーミングしないようです。データの周りに必要最小限の HTML ページを出力するコードを追加したところ、動作したようです。

別の著者がここに書いています: http://encosia.com/easy-incremental-status-updates-for-long-requests/ Internet Explorer は入力の最初の 256 文字を自動的にバッファリングするため、256 文字のスローを入れることをお勧めします。最初は離れたデータですが、私が使用しているバージョン(IE 10)では違いがないようです。

最後に、1 つずれていたので 4 つだけ数えました ;-)

ここに私の作業コードがあります:

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>");
}
于 2013-10-18T19:46:35.380 に答える