【问题标题】:XMLHttpRequest to Microsoft Graph API aborted in IE 11IE 11 中对 Microsoft Graph API 的 XMLHttpRequest 中止
【发布时间】:2017-02-06 02:38:45
【问题描述】:

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

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 (OPTIONS) 请求实际上失败了,它在 Chrome 中就可以通过了。

【问题讨论】:

    标签: internet-explorer xmlhttprequest office365 microsoft-graph-api office365-apps


    【解决方案1】:

    这可能是跨域请求的问题。 不久前我遇到了这个问题,并设法使用 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
        }
    });
    

    【讨论】:

    • 该代码适用于 Chrome 但不适用于 IE 11。此外,尝试使用 jquery 仍然是同样的错误。
    【解决方案2】:

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

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

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

    【讨论】:

    • 没有。这并不能解决问题。
    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    相关资源
    最近更新 更多