1

Моя настройка подобна этой, оба сервера находятся в разных доменах.Потребление Динамика NAV oData webservice с использованием перекрестного домена jQuery

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

Что мне нравится делать, это позвонить в веб-службу NAV 2013 oData через 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, но не уверен, как я могу это сделать?

ответ

1

Вы хотите проверить: 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" 
    } 
}); 
0

Я искал этот ответ несколько раз, и он никогда не работал для меня, возможно потому, что я хочу пройти через учетные данные 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.

 Смежные вопросы

  • Нет связанных вопросов^_^