需要一个非空的请求正文

时间:2019-08-20 00:22:52

标签: c# asp.net-core

我在SO上发现了其他一些可以解决此问题的问题;但是,所有这些问题似乎都是在发送的请求类型(内容类型是问题)还是模型绑定方面存在问题。在我的情况下,错误似乎在action方法的末尾引发在Ok上。

到目前为止,我已经尝试了以下方法:

  • 添加/删除FromBody属性
  • 确保测试框架 Swagger application/json的身份发送
  • 我尝试更改为Patch只是为了看看会发生什么,但是问题仍然存在
  • 我还尝试将退货从Ok更改为NoContent,但问题仍然存在

如上所述,我确实完成了这段代码,并确认我点击了映射代码,并且所有属性均已正确映射。用户本身确实会在数据库中得到更新。仅在执行退出操作方法(在Ok之后)之后才引发错误。因此,由于错误坚持我的请求正文为空,这使我更加失望。

除了实际的空请求正文或错误的内容类型有效负载之外,还会有其他原因引发此错误吗?

    /// <summary>
    /// Updates the provided account and setting information
    /// </summary>
    /// <param name="vm"></param>
    [HttpPost]
    [ProducesResponseType(200)]
    [ProducesResponseType(400, Type=typeof(string))]
    public async Task<IActionResult> UpdateAccountInfo([FromBody]UpdateAccountInfoViewModel vm)
    {
        var appModel = _mapper.Map<ChartLog.Application.Models.UpdateAccountInfoModel>(vm);
        appModel.UserId = User.GetUserId().Value;

        await _accountApp.UpdateAccountAndSettings(appModel);
        return Ok();
    }

2 个答案:

答案 0 :(得分:0)

问题最终是与我创建的自定义中间件中的错误有关。我重播了两次请求。

  public async Task InvokeAsync(HttpContext context, RequestDelegate next)
    {
        string stringBody = string.Empty;
        try
        {
            await next(context).ConfigureAwait(false);
        }
        catch (Exception ex)
        {
            if (context.Request.Body.CanSeek)
            {
                stringBody = await FormatRequest(context.Request).ConfigureAwait(false);
            }
            await HandleExceptionAsync(context, ex, stringBody).ConfigureAwait(false);
        }

        //await next(context).ConfigureAwait(false);
    }

注释掉的代码是罪魁祸首。如果未发生异常,则它将退出尝试并实质上重播相同的RequestDelegate。我的假设是请求流已经被读取,并且已经被处理或读取到最后。

答案 1 :(得分:0)

当我尝试学习HttpPath时遇到了同样的问题。我发现根本原因是:我没有在邮递员中传递“ Content-Length”值。