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 已启用

为 ASP API 令牌请求启用 CORS