无法通过 CORS 将 JSON 发布到 ASPNET Core(415 - 不支持的媒体类型)
Posted
技术标签:
【中文标题】无法通过 CORS 将 JSON 发布到 ASPNET Core(415 - 不支持的媒体类型)【英文标题】:Cannot post JSON to ASPNET Core via CORS (415 - Unsupported media type) 【发布时间】:2017-11-17 18:21:08 【问题描述】:我在让 ASPNET CORE 接收来自 AngularX 客户端跨域发布的 json 请求时遇到问题。我已经环顾四周,但我无法找到针对这种特定问题变体的问题/解决方案。
我在服务器上设置了 CORS,请求通过服务器端,但控制器操作的参数仅包含空值。我在某处读到我必须用[FromBody]
装饰参数,但是当我这样做时,服务器将 415 Unsupported Media 错误返回给我的 AngularX 客户端 - 但不是我的 Chrome PostMan 插件,也不是
这是我在服务器端启用 CORS 的方法
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
app.UseMvc();
app.UseCors("SiteCorsPolicy");
public void ConfigureServices(IServiceCollection services)
services.AddMvc();
var corsBuilder = new CorsPolicyBuilder();
corsBuilder.AllowAnyHeader();
corsBuilder.AllowCredentials();
corsBuilder.AllowAnyMethod();
corsBuilder.AllowAnyOrigin();
CorsPolicy corsPolicy = corsBuilder.Build();
services.AddCors(x => x.AddPolicy("SiteCorsPolicy", corsPolicy));
我的控制器代码如下所示
public class ValuesController : Controller
[HttpPost, Route("api/values/petes-test/")]
public async Task<PetesTestResponse> List([FromBody]PetesTestQuery query)
var result = await ............;
return result;
我的客户端代码如下所示
const headers = new Headers(
'Content-Type': 'application/json; charset=utf-8',
'Accept': 'application/json'
);
return this.http.post(url, JSON.stringify(request), headers: headers )
.map((res: Response) => <TResponse>res.json());
从客户端到服务端的headers如下
Request URL:http://localhost:4201/api/values/petes-test/
Request Method:OPTIONS
Status Code:415 Unsupported Media Type
Remote Address:[::1]:4201
Referrer Policy:no-referrer-when-downgrade
Accept:*/*
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:localhost:4201
Origin:http://localhost:4200
Referer:http://localhost:4200/
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/58.0.3029.110 Safari/537.36
【问题讨论】:
查看此链接可能会得到答案:***.com/questions/44151963/… 您的浏览器会在调用真正的 post 请求之前自动调用 options 方法。这是因为您正在从不同的来源发出请求。您所要做的就是在您的控制器中实现一个选项请求,并在响应中添加支持的请求,如获取、发布等,检查此链接。***.com/questions/29954037/… 【参考方案1】:Configure
方法中添加中间件的顺序定义了在请求中调用这些中间件的顺序。在您的情况下,CORS 中间件是在 MVC 中间件之后定义的,这意味着 MVC 中间件首先处理请求。然后 MVC 中间件匹配路由,因此它得出的结论是不将您的请求转发到下一个中间件,并且在尝试将 OPTIONS
请求传递给 POST
操作后它失败并返回 415 HTTP 状态代码。将UseCors
放在UseMvc
之前,如下所示
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
app.UseCors("SiteCorsPolicy");
app.UseMvc();
【讨论】:
是的,就是这样。谢谢! :)以上是关于无法通过 CORS 将 JSON 发布到 ASPNET Core(415 - 不支持的媒体类型)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Xamarin Forms iOS-App 中接收 ASPN 令牌
在 Java Servlet 上启用了 CORS,但从前端接收到 CORS 错误
通过 AJAX 将 JSON 数据发布到 Web API 失败,并显示“无法将 JSON 值转换为 System.Int32”