c# Web Api 启用了 CORS 并且请求的资源上不存在可怕的 No 'Access-Control-Allow-Origin' 标头
Posted
技术标签:
【中文标题】c# Web Api 启用了 CORS 并且请求的资源上不存在可怕的 No \'Access-Control-Allow-Origin\' 标头【英文标题】:c# Web Api with CORS Enabled and the dreaded No 'Access-Control-Allow-Origin' header is present on the requested resourcec# Web Api 启用了 CORS 并且请求的资源上不存在可怕的 No 'Access-Control-Allow-Origin' 标头 【发布时间】:2014-10-29 18:36:25 【问题描述】:我有一个 C# Web API 项目。我使用 Web API 2 标准创建了一个控制器。我正在尝试仅在一项操作上启用 CORS,这就是我所拥有的:
namespace MyProject.Controllers
public class MyControllerController : ApiController
// POST api/mycontroller
[EnableCors("http://link.myurl.com", "*", "*")]
public bool Post(MyCustomObject customObject)
// Function that returns Bool
return myFunction(customObject);
我的 WebApiConfig.cs 如下所示:
// Web API configuration and services
config.EnableCors();
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/controller/id",
defaults: new id = RouteParameter.Optional
);
// Ignore Null values on JSON Returns
config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings NullValueHandling = NullValueHandling.Ignore ;
config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings DefaultValueHandling = DefaultValueHandling.Ignore ;
这是跨域 AJAX 调用:
$.ajax(
type: "POST",
url: 'http://myurl.com/api/mycontroller',
data: JSON.stringify( Type: 'TextHere', OtherInfo: 'TextHere' ),
contentType: "application/json",
success: function (data)
);
根据以下教程:http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api#how-it-works,我应该正确设置所有内容。
我在 Chrome 中继续收到以下错误:
XMLHttpRequest 无法加载 http://myurl.com/api/mycontroller。不 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://link.myurl.com” 访问。
当我使用 Fiddler 查看调用时,我注意到飞行前原点检查通过状态 200 正常,但当实际调用时返回 500。
有趣的是,即使调用失败,事务也会提交到数据库。几乎就像在代码中运行飞行前原点检查一样,它应该只检查允许原点。
我尝试将以下内容添加到 web.config:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://link.myurl.com" />
</customHeaders>
</httpProtocol>
<system.webServer>
如果我离开 [EnableCors] 行,那么我会收到一个错误,即指定了两个值 (http://link.myurl.com),而只能是一个。如果我删除 [EnabledCors] 行,我会得到原来的错误。
如果你还不能说,我在这里不知所措。具有讽刺意味的是它正在工作(正在提交数据库操作),但浏览器认为它不工作并且从不接受 JSON 返回数据。
帮忙?
【问题讨论】:
您是否尝试将 [EnableCors(...)] 中的“link.myurl.com”替换为“*”只是为了测试目的? 【参考方案1】:我不确定这次为什么会奏效,但我成功了。主要区别可能是我使用 NuGet 安装的库:
Microsoft ASP.NET Web API 2.2 跨域支持
然后,我按照我最初的帖子中指定的方式设置 WebApiConfig.cs 文件,以及我想要允许的操作上方的 EnableCors 选项。
我没有在 web.config 文件中设置任何内容。
我不再收到错误,一定与 NuGet 包有关。
【讨论】:
【参考方案2】:我被这个抓住了。如果使用属性路由,则必须在路由属性映射后EnableCORS
。
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/controller/id",
defaults: new id = RouteParameter.Optional
);
// Web API configuration and services
config.EnableCors();
【讨论】:
以上是关于c# Web Api 启用了 CORS 并且请求的资源上不存在可怕的 No 'Access-Control-Allow-Origin' 标头的主要内容,如果未能解决你的问题,请参考以下文章
400 仅在启用 cors 时响应 asp.net web api POST 请求
带有自定义标头的 Ajax 请求发送到启用 CORS 的 Web API 服务器
在 Azure 上为 .NET Web Api 启用 CORS
在 Azure Web 应用程序中为 Web API 启用 CORS
本地 Javascript Fetch Post 请求失败,调用 ASP.NET Core 2.2 Web API。 CORS 已启用