【问题标题】:.Net Core 2.2 Web API getting 415 Unsupported Media type on a GET?.Net Core 2.2 Web API 在 GET 上获得 415 Unsupported Media type?
【发布时间】:2019-05-19 04:08:32
【问题描述】:

我已将我的 WebApi 项目升级到 .net core 2.2,从那时起,我的所有控制器都从每个 GET 调用中提取 415 Unsupported Media type。这非常奇怪,因为根据我的经验,415 通常是为 POST 保留的。

如果我降级回 2.1,问题就会消失。我已经在我的控制器设置和基本启动配置下面发布了代码。

    [Route("v1/[controller]")]
    [Produces("application/json")]
    [Consumes("application/json")]
    [Authorize]
    public class JobsController : ControllerBase
    {
        [HttpGet]
        public IActionResult GetJobSummaryByUserId([FromQuery] PagedJobRequest pagedJobRequest)
        {
            if (pagedJobRequest.UserId == Guid.Empty)
            {
                pagedJobRequest.UserId = _jwtUtility.GetIdentityId();
            }
            if (!_jwtUtility.DoesJwtIdentityIdMatch(pagedJobRequest.UserId) && !_jwtUtility.IsUserInRole("Administrator"))
            {
                return Unauthorized();
            }

            var returnObj = _jobsService.GetJobSummariesByUserId(pagedJobRequest);

            return Ok(returnObj);
        }
}

在 Startup.cs 中:

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.AddCors(x => x.AddPolicy("MVRCors", y => y.AllowCredentials().AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin()));
        services.AddEntityFrameworkSqlServer();
        }
   public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseSwagger();
            app.UseSwaggerUI(s =>
            {
                s.SwaggerEndpoint("/swagger/v1/swagger.json", "MVR.Api.Jobs");
            });
        }

        ConfigureExceptionHandling(app);
        app.UseMvc();
        app.UseCors("MVRCors");

        loggerFactory.AddSerilog();
    }

【问题讨论】:

  • 查看“Chrome 开发人员工具 > 网络”(或等效项)。问:您的 GET 请求中的 HTTP“接受”标头是什么?问:响应中的 HTTP“Content-Type”是什么?
  • 我正在使用邮递员,在 2.2 之前我从不需要指定任何内容,但让我试试
  • 我们只想看看“谁倒下了”——客户端或控制器。查看发送/接收 HTTP 标头将帮助我们确定这一点。 PS:如果您使用的是 Swagger,为什么还要打扰 Postman?只是好奇...
  • 很好的安全定义不会采用不记名令牌,这是升级到最新版本带来的另一个有趣的变化。我们的控制器完全获得 JWT 授权
  • 拖动 - 前进一步,后退两步 :( 无论如何 - 我真的很好奇您在“接受”请求和“内容类型”响应标头中看到的内容。请随时通知我们!

标签: c# asp.net-web-api .net-core


【解决方案1】:

这是 2.2 的一个已知问题

https://github.com/aspnet/AspNetCore/issues/4396

似乎 2.2 中的 this bug fix 导致任何 GET 请求遵守控制器上的 [Consumes] 属性。以前,在 2.1 中,它们没有。

解决方法是从控制器中删除 [Consumes] 属性并将其仅应用于控制器中的非 GET 方法,或者降级并继续使用 .NET Core 2.1,直到它们发布修复程序。

它有 already been fixed 用于 3.0 .NET Core 版本。我认为他们仍在决定是否会在 2.2 服务版本中修复它。

【讨论】:

  • @willthiswork89: 男孩,我很高兴我还在 2.1 上;)我仍然很好奇你的“接受”标题是什么(我想是“应用程序/json”)和相应的“内容类型”响应标头。如果有机会,请务必发布此信息。
【解决方案2】:

尝试将控制器中的[FromQuery] 替换为[FromForm]

【讨论】:

    【解决方案3】:

    将postman中的内容类型设置为:

    Content-Type: application/json
    

    【讨论】:

    • 在 GET 上设置内容类型将导致框架预期非空正文并导致另一个错误。
    猜你喜欢
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 2019-09-01
    • 2021-07-16
    • 1970-01-01
    相关资源
    最近更新 更多