在Chrome中启用CORS&用于MSCRM Web API的FF(跨子域)

时间:2017-01-04 21:49:13

标签: javascript xmlhttprequest cors dynamics-crm dynamics-crm-2016

我正在处理一个应用程序,该应用程序将托管在MSCRM安装的单独子域中。在这个应用程序中,我依靠CRM的WebAPI来完成几个任务,如检索和记录创建。一切都在Internet Explorer中运行良好,但我仍然在FireFox和Chrome中出现令人讨厌的错误。到目前为止,我尝试了几种不同的方法,包括普通的XHR,JQuery / Ajax,Iframe和Jsonp(都是预构建的和手动的)。我确实在MSCRM服务器上的Web配置中包含了CORS头。继续注意到它已经在Internet Explorer中工作也很重要。

我从chrome收到的错误是: XMLHttpRequest cannot load https://mycrm.mydomain/myorg/api/data/v8.0/new_entityname(00000000-0000-0000-0000-000000000000)?$select=new_fieldname,. Request header field Prefer is not allowed by Access-Control-Allow-Headers in preflight response.

在FireFox中,我只是没有收到任何消息。它根本不起作用。

这是我目前正在使用的功能。



var Request = function (query, successCallback, errorCallback) {
            var _url = FormatString("{0}/{1}/api/data/v8.0/{2}", CrmConnection.BaseUrl, CrmConnection._org, query);

            var req = new XMLHttpRequest();
            req.open("GET", _url, true);
            req.setRequestHeader("OData-MaxVersion", "4.0");
            req.setRequestHeader("OData-Version", "4.0");
            req.setRequestHeader("Accept", "application/json");
            req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
            req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
            req.onreadystatechange = function () {
                if (this.readyState === 4) {
                    req.onreadystatechange = null;
                    if (this.status === 200) {
                        var results = JSON.parse(this.response);
                        if (results["value"] || null != null)
                            successCallback(results.value);
                        else
                            successCallback(results);
                    }
                    else {
                        console.log("Begin Response Headers"); //
                        console.log(this.getAllResponseHeaders()); // Returns empty string
                        console.log("End Response Headers"); //
                        errorCallback(FormatString("XHRWAPI Error: '{0}';", this.statusText)); // The end result of this message is XHRWAPI Error: '' <-- It is also an empty string
                    }
                }
            };
            req.send();
        }
&#13;
&#13;
&#13;

这些是我添加到MSCRM安装的web.config中的标题。

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS" />        
  </customHeaders>
</httpProtocol>

即使我能指出正确的方向,也欢迎任何帮助。

1 个答案:

答案 0 :(得分:0)

正如Jaromanda X所述,添加缺少的标题是解决方案。只需将标题添加到配置文件或IIS(如果适用)。