无法通过 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 - 不支持的媒体类型)的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Laravel API 中启用 CORS?

jQuery、CORS、JSON(无填充)和身份验证问题

如何在 Xamarin Forms iOS-App 中接收 ASPN 令牌

在 Java Servlet 上启用了 CORS,但从前端接收到 CORS 错误

通过 AJAX 将 JSON 数据发布到 Web API 失败,并显示“无法将 JSON 值转换为 System.Int32”

Angular 应用程序无法从 Cloudflare 背后启用 CORS 的站点获取数据