2016-12-14 44 views
-1

我有一個REST API A一個GET方法返回的字符串列表頭錯誤[]沒有「訪問控制允許來源」上jQuery.getJSON()

在我的網站B,我有一個網頁。我想自動完成與字符串值,我從網上API A

我把我的網絡API A在IIS上有一個輸入文本,並將其綁定到localhost:9000

網站B

<input type="text" id="tags"/> 

$("#tags").autocomplete({ 
    source: function (request, response) { 
     jQuery.getJSON(     
      "http://localhost:9000/action/controller", 
      function (data) { 
       alert(data); 
       data = jQuery.unique(data) 
       response(data); 
      } 
     ); 
    }, 
    select: function (event, ui) { 
     //work here 
    }, 
}); 

當我運行網站B,它需要默認端口60400

所以當我寫在輸入id="tags"我得到以下錯誤r:

XMLHttpRequest cannot load http://localhost:9000/action/controller. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:60400' is therefore not allowed access. 

任何人都可以幫忙嗎?

+0

你必須允許你的數據服務器的UI服務器。請谷歌跨域訪問 –

+0

對於本地臨時測試目的,您可以在Chrome上使用https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=zh-CN extesion。 –

+0

順便在哪個服務器上工作。 –

回答

0

您必須在服務器端指定您的標頭。像這樣的東西(的web.config):

<httpProtocol> 
    <customHeaders> 
    <remove name="X-Powered-By" /> 
    <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" /> 
    <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS,PUT,DELETE" /> 
    <add name="Access-Control-Allow-Origin" value="http://localhost:9000" /> 
    <add name="Access-Control-Allow-Credentials" value="true" /> 
    </customHeaders> 
</httpProtocol> 
  1. 很好的利用CORS與解釋你可以在這裏找到的例子: CORS
  2. 如果我沒有記錯CORS需要xhr.withCredentials = true;所以我寧願使用本機var xhr = new XMLHttpRequest();或者如果你希望jQuery。
  3. 任何跨域呼叫都需要2個請求(第1個動詞選項,第2個請求本身)。但是第二個請求只會在第一個從服務器返回提供標題時纔會執行。
2

由於網站A與其所調用的服務不同,因此網站A沒有相同的域(也稱爲源),您顯然面臨一個問題。您必須在您的Web服務上啓用CORS才能使其工作。 我建議你閱讀這篇文章:https://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

出於安全原因,跨源請求不是由未明確配置的應用程序服務的。在.NET堆棧中,您可以使用Cors Nuget-Package,這將使得啓用CORS像2行附加代碼一樣簡單。

0

請檢查所需的標頭是否連接到服務器。根據您要處理的數據,您可以創建preflight請求或simple請求。除非您的服務器具有所需的標題,否則您的客戶端將不被允許訪問。這是由於Same origin policy。請對CORS做一些研究,這是繞過same origin policy的方法之一。 在我的服務器端,我允許使用preflight請求的原點和withCredentials的值作爲true。此外,我正在使用AJAX首先創建預飛行請求,然後觸發POST方法。

HTML5rocks CORS是瞭解CORS功能的絕佳文章。

這是在我的服務器配置中的服務器端代碼。

<add name="Access-Control-Allow-Headers" value="*"/> 
<add name="Access-Control-Allow-Methods" value="OPTIONS" /> 
<add name="Access-Control-Allow-Origin" value="http://localhost:9002" /> 
<add name="Access-Control-Allow-Credentials" value="true" /> 
相關問題