ASP.Net WEB API 2.0 - CORS

Posted

技术标签:

【中文标题】ASP.Net WEB API 2.0 - CORS【英文标题】: 【发布时间】:2015-01-06 12:02:05 【问题描述】:

我正在努力解决似乎与 CORS(跨源资源共享)有关的 ASP.Net WEB API 2.0 问题。

在我的 WEB API,services.xyz 站点,我在 System.WebServer 下的 web.config 中进行了以下配置:

  <httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="http://xyz.web" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
  </customHeaders>
</httpProtocol>

在我使用 WEB API 的 ASP.Net 网站 xyz.web 上,我在 WEB API 上调用 GET 方法时没有问题。

$http( method: 'GET', url: 'http://services.xyz.dk/api/WarningSentences/GetWarningSentencesById?warningSentenceId=' + value )
.success(function (data) 
    deferred.resolve(data);
)

但是当我尝试从 xyz.web 到 services.xyz 的 POST 时,FireFox 告诉我我正在尝试执行不允许的跨源 API 调用。 Chrome 浏览器只是给了我一个 http 状态 405(不允许)。

 $http(
     method: 'POST',
     url: 'http://services.xyz.dk/api/WarningSentences/Update',
     data: value,
     dataType: 'json',
     headers: "Content-Type": "application/json"
 )

如果我删除 services.xyz 中的 CORS 配置,一切都会崩溃,这一点很清楚。因此,似乎允许使用 CORS 配置进行 GET API 调用,但不允许使用 POST API 调用...

为什么?

【问题讨论】:

HTTP 405 的响应是 Web 服务器告诉客户端该方法(此处为 POST)不能在资源上使用。您是否已将服务器端功能设置为允许 POST 请求? 【参考方案1】:

尝试改用“Microsoft.AspNet.WebApi.Cors”库,这是为 Web API 启用 CORS 的更好、更简洁的方法,您无需将标头添加到 web.config 中。

查看this链接了解如何操作的详细信息。

希望对您有所帮助。

【讨论】:

【参考方案2】:

通过将 Application_BeginRequest 事件添加到 WEB API 网站上的 Global.asax 来解决此问题。

protected void Application_BeginRequest()
    
        if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
        
            Response.Flush();
        
    

【讨论】:

以上是关于ASP.Net WEB API 2.0 - CORS的主要内容,如果未能解决你的问题,请参考以下文章

横向扩展 ASP.NET Web Api 2.0?

从头编写 asp.net core 2.0 web api 基础框架

应用程序中断访问 dbcontext、Asp .net 核心 web api 2.0 与实体框架核心 2.0 数据库第一种方法

ASP.NET Core 2.0 中 Web API 的本地用户帐户存储

Asp.net Core 2.0 web api 基础框架 详解

asp.net core 2.0 web api基于JWT自定义策略授权