2012-08-23 10 views
5

IHttpHandlerを持つashxファイルがあります。私はこのIHttpHandlerにいくつかのデータをPOSTするとき、私はいくつかの仕事をし、ファイルを作成し、そのファイルをブラウザに戻すようにユーザーに返すようにします。作成したファイルを使用してファイルをHttpResponseに書き込むと、ブラウザは保存を要求しません。

が、これは私が戻って応答にファイルを書き込もうとする方法である。最終的には、後にブロック内

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"); 

、私が呼び出します。

response.End() 

ときIこのHandlerを呼び出すと、何も起こりません。 Response 200が返され、エラーはスローされませんが、ブラウザはこのファイルを保存するようにユーザーに求めません。この応答は、私には正しいよう

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アプリケーションからこのHttpHandlerを呼び出すJavaScriptを使用しています。

$.ajax({ 
    type: 'POST', 
     url: ashxUrl, 
     data: postData, 
     success: function (result) { 
      // Doin' stuff on success 
     }, 
     error: function (error) { 
      // Doin' stuff on error. 
     } 
}); 
+0

全く同じことを試しました。私は上のコードで単純なページ 'Download.ashx'を作って、別のページ' Default.aspx'からそれをPOSTしました。 3つのブラウザ(IE、FF、Chrome)では完全に動作し、Fiddlerではほぼ同じヘッダーを取得しています。他に何が起こっているのかはっきりしない?興味深い! – mellamokb

+0

JavaScriptを明示的に指定しているところでJavaScriptを記述すると効果的かもしれません。メインの投稿を編集してこのスニペットを追加します。編集:JSスニペットを追加しました。 –

+6

Ah。はい、助けになります。 [AJAX経由でファイルをダウンロードする]ことはできません(http://stackoverflow.com/questions/4814877/how-to-download-file-via-ajax-with-http-post-ie-some-info-in -体)。このような代替ソリューションが必要になります(http://stackoverflow.com/questions/3499597/javascript-jquery-to-download-file-via-post-with-json-data)。 – mellamokb

答えて

2

あなたは、Web呼び出しの結果をJavaScriptで利用できるようにしたいと言ってきました。それが原因でブラウザがあなたにそれを保存するよう促すならば、それはすべてのAJAXは不可能なので、非常に迷惑でしょう。

ブラウザ自体で電話をかけたい場合。 self.location.hrefを設定するだけの簡単な問題です。 POSTの場合、最も簡単な方法は通常、隠しフォームにデータを入力してからsubmit()です。

関連する問題