5

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.
        }
});
4

1 に答える 1

3

Web呼び出しの結果をJavaScriptで利用できるようにする必要があるとのことです。それがブラウザにそれを保存するように促した場合、それは非常に迷惑です。そうすると、すべてのAJAXが不可能になるからです。

ブラウザ自体が呼び出しを行うようにします。GETの場合、設定は簡単ですself.location.href。POSTの場合、通常、最も簡単な方法は、非表示のフォームにデータを入力してから、それを入力submit()することです。

于 2012-08-23T14:02:53.483 に答える