我在尝试从 JS/Ajax 向 WebAPI 发出请求时遇到问题。在我的解决方案中,我有一个在 srv02:2400 上发布的 Web API,以及在 srv02:2300 上发布的我的网站
当我导航到页面 http://srv02:2300/all-requests.aspx 时,页面加载正常,除了应该来 self 的 API 的数据
我收到错误:
XMLHttpRequest cannot load http://srv02:2400/api/requests/find/1. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://srv02:2300' is therefore not allowed access. The response had HTTP status code 400.
但是,如果我采用 url http://srv02:2400/api/requests/find/1并将其粘贴到浏览器中,它为我提供了正确的 JSON 列表!
我尝试按照建议全局启用 CORS here在我的 API 中:
- 安装包 Microsoft.AspNet.WebApi.Cors
通过添加以下内容来更新我的 WebApiConfig.cs:
var cors = new EnableCorsAttribute("http://srv02:2400 ", "", ""); config.EnableCors(cors);
但是,这不起作用。
正如我之前提到的,我正在按照 Ajax 请求来执行我的请求
$.ajax({
url: "http://srv02:2400/api/requests/find/" + id,
type: "GET",
dataType: 'json',
contentType: 'application/json',
success: function (requests) {
console.log('success');
},
error: function (err) {
if (err) {
console.log(err);
}
}
});
我尝试将 json 更改为 jsonp,因为建议 here但没有成功。
关于如何解决这里问题的任何想法。
谢谢!
最佳答案
您的全局属性看起来有误。
我认为您希望改变两件事。
- 您的 CORS 网址应该是您想要允许的应用程序的网址(不是您的 API 网址),即
:2300
而不是:2400
。 - 您没有选择有效的 header 和方法(动词)。您需要在此处使用特定值,或者 *(如果您在全局范围内应用此值,这可能更有意义)。
例如您想要以下内容:
var cors = new EnableCorsAttribute("http://srv02:2300", "*", "*");
config.EnableCors(cors);
这应该指示浏览器(使用 OPTIONS 响应)如果他们想使用任何动词或 header 从 http://srv02:2300/*
调用此 API,就可以了。如果另一个域尝试调用此 API,则不会成功。
关于javascript - 如何允许 ASP.NET 使用 CORS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40497075/