1

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

  1. 带有 HTML/JavaScript 应用程序的 SharePoint Foundation 2013,由 Microsoft 在 Office365 上托管。
  2. Windows Server 2012 和 Dynamics NAV 2013,由 Microsoft 在 Azure 上托管。

我喜欢做的是通过 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 ),但不确定我该怎么做?

4

2 回答 2

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"
    }
});
于 2014-04-10T19:59:46.150 回答
0

我已经搜索了这个答案几次,但它从来没有对我有用,可能是因为我想通过我的 Windows 凭据。

在阅读了这篇文章 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 中遗漏的内容。

于 2016-01-11T12:06:03.503 回答