Использование веб-службы Dynamics NAV oData с использованием междоменного домена jQuery

Мои настройки таковы, оба сервера находятся в разных доменах.

  1. SharePoint Foundation 2013 с приложением HTML/JavaScript, размещенным на Office365 компанией Microsoft.
  2. Windows Server 2012 с Dynamics NAV 2013, размещенный на Azure от Microsoft.

Что мне нравится делать, так это вызывать веб-сервис oData NAV 2013 через jQuery. Я проверил, что мой веб-сервис доступен из браузера, и я получил успешный ответ.

Но когда я пытаюсь вызвать его из приложения в SharePoint, я получаю сообщение об ошибке.

SyntaxError: syntax error <?xml version="1.0" encoding="utf-8" standalone="yes"?>

Это мой код jQuery:

var call = $.ajax({
    url: 'http://url:port/DynamicsNAV70_Instance/odata/MyService',
    type: "GET",
    crossDomain: true,
    username: "username",
    password: "password",
    dataType: "jsonp",
    headers: {
        Accept: "application/json;odata=verbose"
    }
});

call.done(function (data, textStatus, jqXHR) {
    console.log(data.d);
});

call.fail(function (jqXHR, textStatus, errorThrown) {
    console.log("Call failed. Error: " + jqXHR.statusText);
});

Я обнаружил, что "jsonp" плохо работает с XML-ответом, но этот вызов должен возвращать json, не так ли?

Кроме того, в FireBug я на самом деле вижу полный XML-код, возвращенный из сервиса, и он полностью правильный. Таким образом, мое приложение получает правильный XML, но похоже, что это ошибка синтаксического анализа?

Я также думаю о включении CORS ( http://enable-cors.org/index.html) на моем сервере Dynamics, но не уверен, как мне это сделать?

2 ответа

Вы хотите проверить: http://msdn.microsoft.com/en-us/library/dn127071(v=nav.71).aspx

Как я это видел, я бы изменил код следующим образом:

jQuery.support.cors = true;
var call = $.ajax({
    url: 'http://url:port/DynamicsNAV70_Instance/odata/MyService?$format=json',
    type: "GET",
    username: "username",
    password: "password",
    dataType: "json",
    headers: {
        Accept: "application/json;odata=verbose"
    }
});

Я искал этот ответ несколько раз, и он никогда не работал для меня, возможно, потому что я хочу пройти через свои учетные данные Windows.

Я наконец-то получил что-то для работы (NAV2015) после прочтения этой статьи http://www.telerik.com/blogs/cross-domain-queries-to-odata-services-with-jquery и этой страницы https://msdn.microsoft.com/en-us/library/dn127071(v=nav.80).aspx. Ответ, по-видимому, заключается в том, что вам нужно использовать jsonp, который предназначен для обхода междоменных ограничений.

Надеюсь, это поможет кому-то:-)

$.ajax({        
    url: 'http://Server:Port/DynamicsNAV80/OData/Service?$format=json&$callback=?',
    contentType: 'application/json; charset=utf-8',
    dataType: "jsonp",
    type: "GET",
    xhrFields: {
        withCredentials: true
    },
    dataType: "jsonp",
    success: function (data) {
        alert(JSON.stringify(data));
    },
    error: function (xhr, textStatus, errorMessage) {
        alert('Error: ' + errorMessage);
    }
});

Примечание: в IE и Chrome это работает, как я и ожидал - просто проходя через мои учетные данные. В Firefox меня просят дважды войти в систему, один раз для моего сайта, один раз для службы, я не знаю, это мои настройки Firefox или что-то, что я пропустил в Web.config.

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