2016-12-14 16 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" /> 
相关问题