返回IHttpActionResult是否会停止请求执行

时间:2013-11-08 15:09:02

标签: c# asp.net-web-api httpresponse asp.net-web-api2

Here @GlennBlock提到抛出HttpResponseException会立即停止请求执行,而返回HttpResponseMessage并不会停止请求传播(据我所知)。

  

该例外对于立即停止处理和退出非常有用。

     

如果我返回HttpResponseMessage,请求将很乐意继续其余的处理并返回404.主要区别在于是否结束请求。

在.NET Web API 2中,您还可以从IHttpActionResult返回ApiController。是停止请求传播还是与HttpResponseMessage类似?

谢谢;)

1 个答案:

答案 0 :(得分:3)

我认为@GlennBlock在技术上是错误的。投掷HttpResponseException与返回HttpResponseMessage没有什么明显不同。

以下是ASP.NET Web API中使用的模式,由source code提供:

try
{
    return await SendAsyncCore(request, cancellationToken);
}
catch (HttpResponseException httpResponseException)
{
    return httpResponseException.Response;
}
catch (Exception exception)
{
    exceptionInfo = ExceptionDispatchInfo.Capture(exception);
}

在管道中的这一点上,如果你抛出了一个HttpResponseException,它就会像你返回一个HttpResponseMessage一样被对待......它的行为完全相同。

您将注意到的一件事是,在使用Visual Studio进行调试时,调试器将在抛出的HttpResponseException上中断(因为用户代码中没有发生捕获)。如果这是您网站正常运行中常见的预期错误,那么这可能会非常烦人!在这种情况下,您可能希望使用HttpResponseMessage返回错误代码。

另一方面,如果这是一个理论上不会发生的奇怪错误,那么您希望被调试器提醒。您不希望悄悄忽略该错误。你想知道它,所以你理论上可以解决它。在这种情况下,抛出HttpResponseException更有意义。

关于我能说的唯一其他差异是,抛出HttpResponseException可以让你用IExceptionFilter来抓住它。与如何将动作过滤器或授权过滤器应用于方法或控制器类似,您可以应用异常过滤器来处理所有异常。也许您想将它们记录在数据库中。显然,应用属性过滤器要比在每个动作方法中编写try / catch都容易得多。

在这种情况下,抛出异常实际上更多工作,并且比简单地返回响应需要更长的时间。但这是一个区别。

IHttpActionResult用于创建HttpResponseMessage。可以将它想象成HttpResponseMessage工厂,您可以在其中编写一次并通过多种操作方法使用它。在这种情况下,您可以从HttpResponseException中抛出IHttpActionResult。与直接从行动中做到这一点没什么不同。