У меня есть служба WCF, которая использует OWIN для аутентификации, поэтому мне нужно отправлять заголовок Authorization: Bearer <access_key>
с каждым запросом.По этой причине я не могу использовать традиционную скрытую форму + iframe для загрузки файла и должен использовать для этого вызов AJAX.Основываясь на этом ответе , я написал такой код:
var header = "Bearer reallylongaccesskey";
var serviceUrl = "http://mywcfserviceurl";
var downloadToken = Date.now();
$.ajax(url + "&downloadToken=" + downloadToken, {
beforeSend: function (xhr, settings) {
showWaitingMessage(null, "Exporting...");
if (this.url && this.url.toLowerCase().indexOf(serviceUrl) >= 0) {
xhr.setRequestHeader('Authorization', header);
}
return true;
},
cache: false,
complete: function(xhr, textStatus) {
closeWaitingMessage();
document.cookie = "downloadToken=''"; //the server returns the downloadToken as a cookie which is cleared here.
//this was part of the previous form+hidden iframe implementation
},
data: { paramStr: jsonStr },
dataType: "text",
error: ajaxException,
traditional: true,
type: "POST",
success: function(data, textStatus, xhr) {
var contentType = xhr.getResponseHeader("content-type");
var blob = new Blob([data], { type: contentType });
var contentDisposition = xhr.getResponseHeader("Content-Disposition");
var fileName = contentDisposition.substring(contentDisposition.indexOf("=") + 1);
window.navigator.msSaveOrOpenBlob(blob, fileName);
},
timeout: 300000,
xhrFields: {
responseType: "blob"
}
});
Я могу отслеживать запрос к серверу, файл генерируется и возвращается, и на панели инструментов разработчика IE F12 я могувидеть статус ответа 200 OK с правильными заголовками ответа, но каким-то образом вызывается только обратный вызов error
с xhr.status
= 0, а не обратный вызов success
.
Это предназначено для использованияс IE11 только на этом этапе (интранет компании), поэтому HTMLAnchorElement.download
не поддерживается.
В настоящее время я ограничен jQuery 1.7.1.
Что я делаю не так?