Включение CORS в Chrome и FF для веб-API MSCRM (кросс-субдомен)

Я работаю над приложением, которое будет размещено на отдельном поддомене от нашей установки MSCRM. В этом приложении я полагаюсь на WebAPI CRM для выполнения нескольких задач, таких как поиск и создание записей. В Internet Explorer все работает хорошо, но я продолжаю получать неприятные ошибки в FireFox и Chrome. До сих пор я пробовал несколько разных методов, включая обычный XHR, JQuery/Ajax, Iframe и Jsonp (как предварительно скомпонованные, так и вручную). Я действительно включил заголовок CORS в веб-конфигурацию на сервере MSCRM. Также важно продолжать отмечать, что это уже работает в 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();
        }

Это заголовки, которые я добавил в установочный файл web.config MSCRM.

<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 ответ

Решение

Как заявила Jaromanda X, добавление отсутствующих заголовков было решением. Просто добавьте заголовки в ваш конфигурационный файл или IIS, где это применимо.

Другие вопросы по тегам