Response.Flush()はFirefoxでのみ動作します
-
05-07-2019 - |
質問
時間のかかる作業を行う前に、クライアントにコンテンツを送信しようとしています:
Response.Write("Processing...");
Response.Flush();
System.Threading.Thread.Sleep(5000);
Response.Write("Finish");
Response.End();
Firefoxでは期待どおりに動作しますが、IE8、Safari、Chromeでは、すべてのコードが処理されるまで待機してからテキスト全体を表示します。
次のサンプルのように、より適切な形式のHTMLを送信しようとしましたが、同じ結果が得られます。
Response.Write("<html><head><title>test</title></head><body>Processing...</body></html>");
Response.Flush();
System.Threading.Thread.Sleep(5000);
Response.Write("Finish");
Response.End();
ありがとう!
解決
直面している問題は、送信している応答がまだ不完全であるということです。バッファにあるものをすべてブラウザにフラッシュしても、応答の終了を待つか、それまでの処理を行うのはブラウザ次第です。したがって、ブラウザ間の違いです。
さらに悪いことに、サーバーとブラウザの間のインターネット上にあるいくつかの中間ノードのコンセントレータ、ファイアウォールなどから同じ動作を期待できるということです。
要点は、ブラウザーがデータストリームで何かを確実に実行するようにするには、Response.Endでそれを完了する必要があるということです。
つまり、最初に応答データの一部を送信し、残りの送信を遅らせたい場合は、応答を2つに分け、最初の1つを完了し、2つ目の部分を個別にダウンロードすることをお勧めします
他のヒント
これを解決する簡単な方法は、<!> quot;お待ちください、処理中<!> quot;作業を行う実際のページの前のページ。 <!> quot;お待ちください<!> quot;メッセージが表示された後、メタリフレッシュタグやjavascriptを使用して実際の処理ページにリダイレクトすることにより、すぐに処理を開始します。
<!> quot;しばらくお待ちください<!> quot;ページ:
<html>
<head>
<meta http-equiv="refresh" content="0;url=process.aspx?option1=value&...." />
<title>Please Wait, Processing</title>
</head>
<body>
Processing...
</body>
<script type="text/javascript">
window.location = "process.aspx?option1=value&....";
</script>
</html>
注:
- 2つのメソッドを使用して処理を開始することで、ブラウザーが1つを使用できないかどうかを確認し、できれば他のメソッドを使用します。
- 処理URLとクエリ文字列を適切に置き換える必要があります。
- このメソッドの欠点は、ユーザーがブラウザの戻るボタンを押すと、<!> quot; please wait <!> quot;に戻ることです。 <!> quot; process <!> quot;のページこのページは、誤って再びジョブを開始することを意味します。この課題は別のトピックに任せます!
また、IISサーバーがGZIPで出力を圧縮している場合、すべてのResponse.Flush
呼び出しを無視するように見えることに注意してください。
これは、IIS7およびWindows 7でデフォルトでオンになっています。
そして、Fiddlerでテストする場合は、必ず<!> quot; Streaming <!> quot;をオンにしてください。または、FiddlerはフラッシュされたHTMLを収集し、接続が完了するまで保持します。
応答が完了する前(Content-Lengthがわかる前)にResponse.Flush()を呼び出すと、ASP.NETランタイムはチャンクエンコーディングの部分応答を生成します。それをレンダリングする方法を決めるのはブラウザ次第です。私のテストでは、ブラウザーは部分応答に含まれる画像(<img>
タグ)をレンダリングする傾向があることがわかりました。試してみてください。
ただし、早すぎる</html>
の送信には注意してください。ブラウザはそれ以降は無視する場合があります。ただし、ブラウザは常に部分的なページをレンダリングします。したがって、通常どおりページの先頭から開始できます。
役に立つ場合は、本の中でこの例を詳細に説明します。これには、ワイヤ上で何が起こるかを正確に示すパケットトレースが含まれます。 Ultra-Fast ASP.NET 。
ブラウザはコンテンツの長さに基づいてコンテンツを取得および使用すると考えられるため、1000文字程度のパディングを試みることができます。例:
string myVeryShortMessage = <!> quot; Processing ... <!> quot ;;
Response.Write(myVeryShortMessage.PadRight(1000)); Response.Flush();
System.Threading.Thread.Sleep(5000);
Response.Write(<!> quot; Finish <!> quot; .PadRight(1000)); Response.Flush();