我在休息api A
中有一个GET方法,它返回一个string []
在我的网站B
中,我有一个网页。我想使用从web 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"
中写入时,我收到以下错误:
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 :(得分:2)
您显然遇到了问题,因为webSite A与其调用的服务没有相同的域(a.k.a. origin)。您必须在Web服务上启用CORS才能使其正常运行。 我建议你阅读这篇文章:https://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
出于安全原因,未明确配置的应用程序不会提供跨源请求。在.NET堆栈上,您可以使用Cors Nuget-Package,这将使CORS像2行附加代码一样简单。
答案 1 :(得分: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>
xhr.withCredentials = true;
,所以我宁愿使用原生var xhr = new XMLHttpRequest();
或者你想要jQuery。 答案 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" />