【问题标题】:WebAPI controller throwing exception in backgroundWebAPI控制器在后台抛出异常
【发布时间】:2017-09-01 11:35:48
【问题描述】:

我有一个安静的 WebAPI 应用程序来处理来自 AngularJS 应用程序的请求。需要 GET 动词的控制器操作可以正常工作,但不返回任何内容的 POST/PUT 操作将引发 Nullreference 异常。

例子:

[HttpPut]
public void Update()

这在函数执行返回后给我以下消息:

System.NullReferenceException: Object reference not set to an instance of an object. <SendAsync>d__0.MoveNext

它还会向客户端返回 HTTP 状态码 204。

通过将方法签名更改为异步并返回一个空对象,它将按预期工作:

[HttpPut]
[Route("")]
public async Task<object> Update(ProfileViewModel model)
{
    _profileManager.Update(model);

    return Ok(new {});
}

请注意,仅返回状态代码 200 是行不通的。部分内容也必须返回,否则抛出异常。

这发生在每个不是 GET 的请求上,包括 DELETE。如何在不必更改签名并为每个方法返回匿名对象的情况下解决此问题?

【问题讨论】:

  • 1.请围绕您的更新方法分享更多代码。 2.您是否使用任何自定义格式化程序/模型绑定器?
  • 我用完整的 Update() 方法更新了这个问题,正如你所见,它并没有做太多。关于格式化程序,是的 - 我使用格式化程序进行自定义 Json 序列化。
  • 在尝试对其进行更新之前,您需要明确检查 Null 模型对象。那应该避免空引用异常。

标签: asp.net rest asp.net-web-api


【解决方案1】:
  1. 请在没有任何 _profileManager.Update(model) 的情况下尝试此代码;
  2. 如果您使用的是 .net core,请使用 IActionResult。
  3. return Ok() 不会强制您返回任何内容,应该可以正常工作。
  4. 如果这不起作用,请检查您的自定义序列化程序中是否有任何错误。
  5. 如果这可行,则放回您的 _profileManager.Update(model) 并检查是否引发任何错误。

    [HttpPut]
    [Route("")]
    public async Task<IHttpActionResult> Update(ProfileViewModel model)
    {
      return Ok();
    }
    

【讨论】:

  • 谢谢,我会试试这个,然后返回给你结果。
  • 请尝试对您的序列化程序进行单元测试。如果有任何问题,这将使您更快地找到问题的根源
  • 在注释掉 Startup 类中的所有配置语句后,我发现正是这一行造成了这种不当行为:WebApiConfig.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor())); 这个包甚至已被弃用,因此我不得不为处理请求压缩。 Package link谢谢@Gurpreet
【解决方案2】:

你不必返回对象:

[HttpPost]
public IActionResult Update()
{
    return Ok();
}

【讨论】:

  • 这将返回 200 响应,但无论如何都会抛出异常。
  • 如果你得到这个代码的异常,你还有一些问题。
猜你喜欢
  • 2021-08-26
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
相关资源
最近更新 更多