我有一个使用OWIN进行身份验证的WCF服务,因此我需要在每个请求中发送一个Authorization: Bearer <access_key>
头。因此,我无法使用传统的隐藏表单+ iframe下载文件,而必须使用AJAX调用。基于this answer,我编写了以下代码:
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
回调来调用。
这只能在此阶段(公司Intranet)与IE11一起使用,因此不支持HTMLAnchorElement.download
。
我目前仅限于jQuery 1.7.1。
我在做什么错了?