Использование веб-службы Dynamics NAV oData с использованием междоменного домена jQuery
Мои настройки таковы, оба сервера находятся в разных доменах.
- SharePoint Foundation 2013 с приложением HTML/JavaScript, размещенным на Office365 компанией Microsoft.
- 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.