1

我的設置是這樣的,兩臺服務器都在不同的域。Consuming Dynamics NAV oData使用jQuery跨域的webservice

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

我喜歡做的是通過jQuery調用NAV 2013 oData webservice。 我已經檢查過我的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),但不知道我該如何做到這一點?

回答

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中遺漏的內容。