Web API 2 Cors 请求错误

Posted

技术标签:

【中文标题】Web API 2 Cors 请求错误【英文标题】:Web API 2 Cors Request Error 【发布时间】:2016-06-10 06:59:04 【问题描述】:

我正在尝试为我正在使用 WebAPI 2 处理的项目设置 CORS。我开始遇到问题,所以我直接从 asp.net 论坛here 创建了一个演示应用程序。一切正常,直到我需要使用 json 作为内容类型。然后我开始得到:

对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。

我了解这种内容类型会发送预检请求,但我对如何让它通过感到目瞪口呆。我错过了什么吗?一旦我从 AJAX 请求中删除“contentType:'application/json'”属性,它就可以工作了。

TestController.cs

[Authorize]
[EnableCors(origins: "*", headers: "*", methods: "*")]
public class TestController : ApiController

    // GET api/<controller>
    public HttpResponseMessage Get()
    
        return new HttpResponseMessage()
        
            Content = new StringContent("GET: Test message")
        ;
    

    public HttpResponseMessage Post([FromBody]string name)
    
        return new HttpResponseMessage()
        
            Content = new StringContent("POST: Test message")
        ;
    

    public HttpResponseMessage Put()
    
        return new HttpResponseMessage()
        
            Content = new StringContent("PUT: Test message")
        ;
    

WebApiConfig.cs

public static void Register(HttpConfiguration config)
    
        // 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 
        );
    

Ajax 请求

$.ajax(
            type: "POST",
            url: 'http://localhost:17515/',
            data: JSON.stringify("Test"),
            xhrFields: 
                withCredentials: true
            ,
            contentType: "application/json"
        );

【问题讨论】:

OPTIONS 405 (Method Not Allowed) web api 2的可能重复 【参考方案1】:

在您的 WebApiConfig.cs 中,您可以尝试在此处而不是在控制器上启用 cors 属性。

        var cors = new EnableCorsAttribute("*", "*", "*");
        config.EnableCors(cors);

而不仅仅是

        config.EnableCors();

这是我目前正在运行的一个测试项目。

【讨论】:

【参考方案2】:

客户端首先会向服务器发送一个OPTIONS 请求。对于这个请求,服务器应该添加一个标头:

Access-Control-Allow-Origin: http://localhost:17822

这表示在 17515 端口上运行的 API 接受来自 17822 端口服务的客户端的请求。

您可以尝试将属性更改为:

[EnableCors(origins: "http://localhost:17822", headers: "*", methods: "*")]

我们没有使用EnableCors 的良好体验,因此我们使用 OWIN 处理 OPTIONS 请求,只需返回 200 OK 并手动将适当的标头添加到已批准来源发送的所有 OPTIONS 请求中。

MSDN上有一篇关于CORS的好文章(可能你已经看过了):https://msdn.microsoft.com/en-us/magazine/dn532203.aspx

【讨论】:

以上是关于Web API 2 Cors 请求错误的主要内容,如果未能解决你的问题,请参考以下文章

即使在配置 ASP.NET Core Web API 中启用了 CORS,CORS 也会阻止发布请求

Web Api 2 和 Angular 之间的 CORS 错误

Web Api 2 Preflight CORS 请求承载令牌

http 请求被 Flutter Web 的 Cors 策略阻止

多个 CORS 适用于 GET 但不适用于 PUT/POST 与飞行前请求 Web api 2

为 ASP API 令牌请求启用 CORS