Microsoft Graph API 的 XMLHttpRequest 在 IE 11 中中止

XMLHttpRequest to Microsoft Graph API aborted in IE 11

我正在使用以下代码使用 Microsoft Graph 将大文件(但小于 62MB)上传到 OneDrive API。

let req = new XMLHttpRequest();
req.open("PUT", url, true);
req.setRequestHeader("Authorization", "Bearer " + this.authProvider.tokens.graph);
req.setRequestHeader("Content-Length", file.size.toString());
req.setRequestHeader("Content-Range", "bytes 0-" + (file.size - 1).toString() + "/" + file.size.toString() );
req.upload.onprogress = (e) => {
    let progress = Math.floor(e.loaded / e.total * 100);
    console.log(progress);
};
req.upload.onerror = (e: any) => {
    console.log("error");
};
req.onload = (e) => {
    console.log("done");
};
req.send(buffer);

从 Chrome(迄今为止的最新版本)开始一切顺利,但在创建会话后,create session 请求返回的 url 上传失败。我在 IE 11 控制台和网络选项卡中收到错误 SCRIPT7002: XMLHttpRequest: Network Error 0x80070005, Access is denied.,我看到请求状态为 aborted,发起者是 CORS Preflight 请求。根据其他测试,我认为错误来自 req.open("PUT", url, true); 行。

-更新-

它实际上是对返回的 URL 的飞行前 CORS(选项)请求实际上失败了,在 Chrome 中顺利通过。

这可能是跨域请求的问题。 不久前我遇到了这个问题,并设法使用 JQuery 解决了它。
在您的 <head> 标签中包含以下内容

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script src="YourScriptNameHere.js" type="text/javascript"></script>

然后在您的 JavaScript 文件中:

$(function () {
    $.ajax({
        type: "PUT"
        , url: "File.xml"
        , dataType: "xml"
        , success: parseXml
    });
    function parseXml(xml) {
        //Your code here
    }
});

问题可能是您正在设置 Content-Length header。您不应该在此处明确设置 header(无论如何,它只是当前请求的长度,而不是整个文件的长度)。

虽然这听起来很武断,但我对发生的事情有一个理论,但我现在无法对其进行测试。我的理论是 IE 没有通过 CORS 预检,因为服务器没有明确地将 Content-Length 广告为允许的 header(因为它在始终允许的默认 header 集合中) . IE 可能正在对您尝试发送的 header 与 CORS 预检在其允许列表中返回的内容进行显式检查。

无论如何,您都应该停止设置 Content-Length header,希望这也能解决您的问题。如果没有,请告诉我,我会深入挖掘。