2012-08-23 2 views
5

У меня есть файл ashx с IHttpHandler. Когда я отправляю некоторые данные этому IHttpHandler, я делаю некоторую работу, создаю файл, а затем хочу вернуть этот файл пользователю, чтобы он мог сохранить файл через браузер.Запись файла в 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() 

Когда я вызовите этого обработчика, ничего не происходит. Ответ 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] 

Этот ответ выглядит правильно для меня. Он содержит содержимое файла - однако в любом из основных браузеров диалог файла не предлагает мне сохранить файл.

Что я здесь делаю неправильно?

Обновление: В случае, если это помогает, здесь я использую JavaScript из своего веб-приложения для вызова этого HttpHandler.

$.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'. Во всех трех браузерах (IE, FF, Chrome) он отлично работает, и я получаю почти те же заголовки в Fiddler. Не знаете, что еще может произойти? – mellamokb

+0

Интересно! Возможно, это поможет описать мой JavaScript, где я явно делаю этот запрос. Я отредактирую основную запись, чтобы включить этот фрагмент. EDIT: Я добавил фрагмент JS. –

+6

Ах. Да, это помогает. Вы не можете выполнить [загрузку файла через 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

Вы сказали, что хотите, чтобы результаты веб-звонка были доступны для вашего javascript. Было бы крайне неприятно, если бы это побудило браузер предложить вам сохранить его, так как тогда все AJAX было бы невозможно.

Вы хотите, чтобы браузер сам вызывал звонок. Для GET это просто вопрос установки self.location.href. Для POST самым простым способом обычно является заполнение скрытой формы данными, а затем submit().