5

ボタンのイベントでオンザフライでファイルを生成しています。次のコードが必要です。

Response.ClearHeaders();
Response.ClearContent();
Response.Buffer = false;
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment; filename=Duck.xml");
Response.Write("First part");
Response.Flush();

//simulate long operation   
System.Threading.Thread.Sleep(10000);

//Done
Response.Write("Done");
Response.Flush();
Response.End();

操作には時間がかかる可能性があるため、最初のフラッシュの後に [名前を付けて保存] ダイアログが表示されるようにしたいと思います。どうすればいいですか?

いくつか遊んだ後、256文字をバッファリングすることがわかりました(新しい文字列( 'x'、256)をクライアントに送信することで再現可能です)。

4

2 に答える 2

2

Internet Explorerを使用していると思います。これは、MIMEタイプの検出中に256バイトのバッファーを使用することが明確に示されているためです。

ドキュメントによると:http://msdn.microsoft.com/en-us/library/ms775147 (v = vs.85).aspx

「text/plain」、「application / octet-stream」、空の文字列、またはnullの場合、MIMEタイプはあいまいです。

..。

FindMimeFromDataは通常、呼び出されたときに3つのパラメーターを受け取ります。キャッシュファイル名(関連付けられたURLから派生すると想定)、コンテンツの最初の256バイトまでを含むバッファーへのポインター、および通常対応する「推奨」MIMEタイプです。サーバーが提供するMIMEタイプ(content-typeヘッダーを介して)。

次に、最初の256バイトがバッファを満たすために送信されない場合、MIMEタイプの判別を開始することさえできません。MIMEタイプが決定されると、WindowsレジストリCLSIDに関連付けられ、ストリームに表示するUIの種類が決定されるため、[名前を付けて保存]ダイアログが作成されます。

コメントで述べられているように、最も広く使用されているソリューションは、次のように任意の文字の256の出現で応答を埋めるようです: http: //encosia.com/easy-incremental-status-updates-for-long-requests/

// Padding to circumvent IE's buffer*
Response.Write(new string('*', 256));  
Response.Flush();

また、同じ種類の動作の影響を受ける可能性のあるIE対応のエラーページで同様の内容を読んだことも覚えています。http://blogs.msdn.com/b/ieinternals/archive/2010/08/19/http-error-pagesを参照してください。 -in-internet-explorer.aspx

編集 :

@Benのコメントによると、あなたの場合、IEの明確なコンテンツタイプでは、「text/xml」または「application/xml」に設定すると問題が解決するはずです。

XMLサイトマップに送信する必要があるContent-Type値を参照してください。違いのために。

于 2012-10-05T11:16:57.703 に答える
-1

それを行う方法はないと思います。End()メソッドが呼び出された場合にのみ、応答が返されます。

于 2012-10-04T10:58:08.210 に答える