2017-09-01 54 views
0

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

实施例:

[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。我如何解决这个问题,而不必更改签名并为每一种方法返回一个匿名对象?

+0

1。请分享更多一点你的代码在你的更新方法。 2.您是否使用任何自定义格式器/模型活页夹? – Gurpreet

+0

我用完整的Update()方法更新了这个问题,正如你所看到的那样,它没有太多的工作。关于格式化程序,是的 - 我使用格式化程序进行自定义Json序列化。 –

+0

[什么是NullReferenceException,以及如何解决它?]可能的重复(https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it ) – Igor

回答

1
  1. 请试试这个代码,而无需任何_profileManager.Update(模型);
  2. 如果您使用.net核心,请使用IActionResult。
  3. return Ok()不强制你返回任何东西,并应该工作。
  4. 如果这不起作用,然后检查您的自定义序列化程序中的任何错误。
  5. 如果该工程然后放回您的_profileManager.Update(模型),并检查是否抛出任何错误。

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

谢谢,我会试试这个,结果回来给你。 –

+0

请尝试单元测试您的序列化程序。如果有任何问题,会导致问题的来源更快 – Gurpreet

+0

在注释掉Startup类中的所有配置语句之后,我发现它是这条线创建了这个不良行为: 'WebApiConfig.MessageHandlers.Insert(0,新的ServerCompressionHandler(新的GZipCompressor(),新的DeflateCompressor()));' 这个包甚至已经被弃用了,因此我必须找到另一个处理请求压缩的解决方案。[打包链接](https://www.nuget.org/packages/Microsoft.AspNet.WebApi.MessageHandlers.Compression/) 谢谢@Gurpreet –

1

您不必返回对象:

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

这将返回一个200响应,但异常将抛出。 –

+2

如果你用这段代码得到异常,你还有一些问题。 –