2013-03-20 198 views
3

我對Ajax比較陌生,只是負責這個跨域調用。我們在我們的網頁上有一個文本框,用戶將用它來搜索公司名稱。通過單擊文本框旁邊的按鈕,將會請求Ajax調用。不幸的是,Web服務位於一個單獨的域中,所以這自然會造成問題。Ajax - '訪問控制 - 允許來源'不允許訪問本地主機'

以下是我做這項工作的最佳嘗試。我還應該注意到,此調用的目的是以XML格式返回結果,這將在請求的success部分進行解析。

這裏又是錯誤消息:

Origin http://localhost:55152 is not allowed by Access-Control-Allow-Origin.

我無所適從,以什麼爲一個變通辦法做的,任何想法將不勝感激。

function GetProgramDetails() { 
    var URL = "http://quahildy01/xRMDRMA02/xrmservices/2011/OrganizationData.svc/AccountSet?$select=AccountId,Name,neu_UniqueId&$filter=startswith(Name,\'" + $('.searchbox').val() + "\')"; 
    var request = $.ajax({ 
     type: 'POST', 
     url: URL, 
     contentType: "application/x-www-form-urlencoded", 
     crossDomain: true, 
     dataType: XMLHttpRequest, 
     success: function (data) { 
      console.log(data); 
      alert(data); 
     }, 
     error: function (data) { 
      console.log(data); 
      alert("Unable to process your resquest at this time."); 
     } 
    }); 
} 
+2

嘗試在您的響應標題中添加Access-Control-Allow-Origin:*。 – PSL 2013-03-20 21:07:04

+0

你能提供一個如何做的例子嗎? – NealR 2013-03-20 21:21:12

+1

好的。這是c#code.Try Response.AppendHeader(「Access-Control-Allow-Origin」,Request.Headers [「Origin」]);或Response.AppendHeader(「Access-Control-Allow-Origin」,「*」); – PSL 2013-03-20 22:13:43

回答

6

此錯誤是由於在跨域資源共享中強制實施的限制。這已作爲安全功能的一部分實施,以通過跨域調用來限制資源的客戶端(域)。當您向webservice或api或類似服務器發送請求時,會在服務器或目標(此處爲api)的請求中添加Origin標頭,以驗證請求是否來自授權源。理想情況下,API /服務器應該在收到的Request header中查找Origin,並且可能會根據允許服務資源的源(域)集合進行驗證。如果它來自允許的域,它將在響應頭中添加與"Access-Control-Allow-Origin"值相同的域。通配符也是允許的,但問題在於,通配符允許任何人發出請求並獲得服務(像api一樣的限制通過Windows身份驗證或cookie進行身份驗證,您需要發送withCredentials*不允許)。使用通配符來源並不是一個很好的做法,它使響應標題向所有人開放。

這些都是一些方法來設置響應的文件頭和值: -

Access-Control-Allow-Origin: * 
Access-Control-Allow-Origin: http://yourdomain.com 

你甚至可以在同一個響應添加多個訪問控制允許來源頭(我相信在大多數瀏覽器的作品)

Access-Control-Allow-Origin: http://yourdomain1.com 
Access-Control-Allow-Origin: http://yourdomain2.com 
Access-Control-Allow-Origin: http://yourdomain3.com 

在服務器端(C#語法),你可以這樣做: -

var sourceDomain = Request.Headers["Origin"]; //This gives the origin domain for the request 
    Response.AppendHeader("Access-Control-Allow-Origin", sourceDomain); //Set the response header with the origin value after validation (if any) .Depending on the type of application you are using syntax may vary. 

希望這有助於!

+0

我猜''「Origin」]'將是相同的http:// yourdomain.com' ? (在我的情況下,這將是'http:// localhost:55152') – NealR 2013-03-21 15:49:02

+0

是的。您可以通過調試Request.Headers [「Origin」]或使用fiddler在您的請求中查找標頭來確認它在您的服務器代碼中。 – PSL 2013-03-21 15:51:14

+1

要寫這個文件的哪個文件?或者在哪裏寫這個沒有提到。 – 2015-10-15 15:44:27

相關問題