Web Api 2 CORS 不适用于 POST

Posted

技术标签:

【中文标题】Web Api 2 CORS 不适用于 POST【英文标题】:Web Api 2 CORS not working with POST 【发布时间】:2015-11-18 03:42:18 【问题描述】:

根据asp.net tutorial,我们只需要以下代码即可在Web Api应用程序上启用cors:

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

以下是我的代码:

public static class WebApiConfig

    public static void Register(HttpConfiguration config)
    
        // Web API configuration and services  
        var cors = new EnableCorsAttribute("*","*", "*");
        config.EnableCors(cors);

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/controller/id",
            defaults: new  id = RouteParameter.Optional 
        );

        var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
        jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

        config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    

Get 工作正常,但Post 请求仍然出错

以下是错误,我正在发帖:

POST http://api.example.com/token 404(未找到) XMLHttpRequest 无法加载 http://api.example.com/token。没有“Access-Control-Allow-Origin”标头 存在于请求的资源上。原点'http://www.example.com' 因此不允许访问。响应包含 HTTP 状态代码 404.

【问题讨论】:

对同一资源的非CORS(同域)POST请求是否成功?我们可以看看你的控制器方法吗? 同一个域。 Web Api 只是主域 api.mydomain.com 的子域。 子域不是同一个域。 然后 var cors = new EnableCorsAttribute("","", "*"); config.EnableCors(cors);应该工作吗? 我什至不确定您的方向是否正确。 404错误?这条路线甚至存在吗? WebApi 路由区分大小写......你确定你不应该点击/Token 吗? 向我们展示您的控制器代码/路由。 【参考方案1】:

您需要将以下内容添加到您的 Web.Config:

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

System.webServer 配置节点内部。

【讨论】:

新错误:“Access-Control-Allow-Origin”标头包含多个值“*、*”,但只允许一个。因此不允许访问 Origin 'example.com'。 尝试删除注册中的代码并运行它。如果不起作用,请参阅以下帖子***.com/questions/22343384/… 一旦添加了 NuGet 包并且 CORS 正常工作,这将由于发出重复的 Allow-Origin 标头而导致上述错误。【参考方案2】:

您需要将 Microsoft.AspNet.WebApi.Cors NuGet 包添加到您的项目中,然后 WebApiConfig 中的 CORS 设置才能真正起作用。

【讨论】:

确保你在 web.config 中没有 的东西。您需要 NuGet 包和 WebApiConfig 中的内容,但不需要任何告诉 IIS 执行自定义标头的内容。【参考方案3】:

也许你应该在控制器中为发布请求编写一个动作

就这样

public HttpResponseMessage Post()

    //Do something here

【讨论】:

以上是关于Web Api 2 CORS 不适用于 POST的主要内容,如果未能解决你的问题,请参考以下文章

Cors 不适用于删除和放入 web api2

.NET Web API CORS 不适用于所有路由

启用 CORS 不适用于 Spotify Web API [重复]

CORS 不适用于 ASP NET 5 Web Api

CORS 不适用于从 Ajax 到 ASP.NET Core Web API 的调用

Java Spring REST API CORS 不适用于通过 jQuery 和 Chrome 的 DELETE 请求