CORS 在 web api 中的 POST 失败
Posted
技术标签:
【中文标题】CORS 在 web api 中的 POST 失败【英文标题】:CORS failing for POST in web api 【发布时间】:2019-03-21 00:55:27 【问题描述】:在 .NET 核心应用程序中为简单的 web api 设置 CORS 我有这个:
public void ConfigureServices(IServiceCollection services)
services.AddCors(options =>
options.AddPolicy("GetPolicy",
builder => builder.AllowAnyOrigin()
.WithMethods("GET")
.WithHeaders("x-mycustomheader-cors"));
options.AddPolicy("PostPolicy",
builder => builder.AllowAnyOrigin()
.WithMethods("POST")
.WithHeaders("x-mycustomheader-cors"));
);
services.AddMvc();
我有一个像这样设置并且工作正常的 get 端点:
[HttpGet]
[EnableCors("GetPolicy")]
[AuthorizationFilter]
public IEnumerable<MyModel> Get()
//...
效果很好,但这(在不同的控制器中):
[HttpPost]
[EnableCors("PostPolicy")]
[AuthorizationFilter]
public void Post([FromBody]MyOtherModel[] models)
//...
失败:
对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。
如果我将PostPolicy
更改为:
options.AddPolicy("PostPolicy",
builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
然后 POST 可以跨域正常工作,但我更愿意不只是允许任何事情。那么我在这里错过了什么?
【问题讨论】:
你应用了这个金块吗? "Browsers aren't entirely consistent in how they set Access-Control-Request-Headers. If you set headers to anything other than "*" (or use AllowAnyHeader), you should include at least Accept, Content-Type, and Origin, plus any custom headers that you want to support." @spender - 非常有用,谢谢。我刚刚得出的结论是,是Content-Type
绊倒了它,似乎是因为我将Content-Type
设置为application/json
,根据你的链接,Content-Type
只有在以下情况下才会自动通过它是application/x-www-form-urlencoded
、multipart/form-data
或 text/plain
【参考方案1】:
尝试了一下,似乎AllowAllHeaders
是必要的部分,所以我更深入地研究了正在传递的标头,奇怪的是,它似乎是Content-Type
标头被绊倒了。
所以这有效(来自 JSFiddle 中的 Chrome):
options.AddPolicy("PostPolicy",
builder => builder.AllowAnyOrigin()
.WithMethods("POST")
.WithHeaders("x-chmura-cors", "Content-Type"));
这令人惊讶,因为我原以为不需要明确包含标准标头(如 Content-Type
)。
当然,错误消息完全没有帮助。
编辑
所以根据这个:https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.1#preflight-requests(感谢@spender),问题是Content-Type
只有在它的值是:
Content-Type 标头(如果已设置)具有以下值之一:
application/x-www-form-urlencoded 多部分/表单数据 文本/纯文本
我将我的设置为application/json
,我想这就是它不喜欢的地方。
【讨论】:
很高兴为您提供帮助:)以上是关于CORS 在 web api 中的 POST 失败的主要内容,如果未能解决你的问题,请参考以下文章
具有多个 HttpPost 方法的 Web Api 中的 CORS 问题
AWS API Gateway CORS 对 OPTIONS 正常,对 POST 失败
Axios 中的 Cors OPTIONS 方法在 Laravel 和 Nginx 中失败
来自 ASP NET Web API 的 CORS 阻止 Ajax POST 调用 - 对预检请求的响应未通过访问控制检查