Хорошо, я вырывал свои волосы об этом целую вечность. У меня есть веб-сервис, который отправляет zip-файл в браузер. Это работает; когда я тестирую WebService и напрямую «вызываю» метод через него, zip-файл корректно загружается в браузер.
Проблема возникает, когда я использую jQuery для отправки запроса AJAX в WebService - файл ZIP загружается в ответ, но остается в ответе и не загружается в виде файла.
Вот мой код:
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.ContentType = "application/zip";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=pleasework.zip");
using (ZipFile zip = new ZipFile())
{
zip.AddDirectory("c:\\inetpub\\mediaserver\\music\\mixes");
zip.AddFile("c:\\test.txt");
zip.AddFile("c:\\test2.txt");
zip.Save("c:\\filename.zip");
}
HttpContext.Current.Response.TransmitFile("c:\\iloveshrooms.zip");
return "done";
}
Теперь это работает, поскольку файл загружается, когда я использую функцию «invoke» при переходе непосредственно к сервису.
Вот мой запрос jQuery AJAX ...
function getFile() {
alert("sending POST request...");
$.ajax({
type: 'POST',
url: 'ZipService.asmx/GetZipFile HTTP 1.1',
contentType: "application/x-www-form-urlencoded",
data: '{ "path":"c:\\inetpub\\mediaserver\\music\\mixes" }',
dataType: '',
beforeSend: function(xhr) {xhr.setRequestHeader("Accept","application/zip");},
success: function() {alert(":-)");},
failure: function() {alert(":-(");}
});
}
Я добавил код в beforeSend, чтобы запрос явно указывал, какой ответ должен ожидать браузер.
Я использую Firebug для мониторинга заголовков запросов / ответов и не вижу в них ничего плохого (кроме случаев, когда я смотрю на содержимое ответа, оно заполнено двоичными данными И имеет тот же размер, что и файл). Я отправляю.
Я только что попытался загрузить снимки экрана заголовков запроса / ответа и содержимого ответа, но у меня пока недостаточно репутационных очков, чтобы сделать это: - (
Размер ответа такой же, как и у файла Zip, поэтому я предполагаю, что он отправляется обратно в браузер, но браузер не знает, что с ним делать.
Протестировано в IE, FF & Chrome и результаты соответствуют.
Если бы кто-нибудь мог пролить свет на это, я был бы очень признателен!