IHttpHandler を含む ashx ファイルがあります。この IHttpHandler にデータを POST するときは、何らかの作業を行い、ファイルを作成してから、そのファイルをユーザーに返して、ブラウザー経由でファイルを保存できるようにします。
ファイルを作成したら、次のようにしてファイルを応答に書き戻そうとします。
HttpResponse response = context.Response;
response.ClearContent();
response.Clear();
response.ContentType = "application/octet-stream";
response.AddHeader("Content-Disposition", "attachment; filename=MYFILE.EXT");
response.WriteFile("C:\tempstuff\MYFILE.EXT");
後の finally ブロックで、次のように呼び出します。
response.End()
この Handler を呼び出しても、何も起こりません。応答 200 が返され、エラーはスローされませんが、ブラウザーはユーザーにこのファイルを保存するように要求しません。
Fiddler によってキャプチャされた応答は次のようになります。
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Thu, 23 Aug 2012 12:12:19 GMT
X-AspNet-Version: 4.0.30319
Content-Disposition: attachment; filename=MYFILE.EXT
Cache-Control: private
Content-Type: application/octet-stream
Content-Length: 781053
Connection: Close
[raw content of the file here]
この応答は私には正しいように見えます。ファイルの内容が含まれていますが、主要なブラウザのいずれでも、ファイルを保存するように求めるファイル ダイアログはありません。
ここで何が間違っていますか?
更新:役立つ場合に備えて、Web アプリケーションから JavaScript を使用してこの HttpHandler を呼び出す場所を次に示します。
$.ajax({
type: 'POST',
url: ashxUrl,
data: postData,
success: function (result) {
// Doin' stuff on success
},
error: function (error) {
// Doin' stuff on error.
}
});