使用jQuery跨域消耗Dynamics NAV oData Web服务

时间:2013-07-05 10:38:40

标签: jquery cross-domain sharepoint-2013 dynamics-nav dynamics-nav-2013

我的设置是这样的,两台服务器都在不同的域中。

  1. 带有HTML / JavaScript应用程序的SharePoint Foundation 2013,由Microsoft在Office365上托管。
  2. Windows Server 2012 with Dynamics NAV 2013,由Microsoft托管在Azure上。
  3. 我喜欢做的是通过jQuery调用NAV 2013 oData webservice。 我已经检查过我的网络服务是否可以从浏览器访问,我确实得到了成功的回复。

    但是,当我尝试从我在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,但看起来它是一个解析错误?

    我还想在我的Dynamics服务器上启用CORS(http://enable-cors.org/index.html),但不知道我该怎么做?

2 个答案:

答案 0 :(得分: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"
    }
});

答案 1 :(得分: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中遗漏的内容。