Here @GlennBlock提到抛出HttpResponseException
会立即停止请求执行,而返回HttpResponseMessage
并不会停止请求传播(据我所知)。
该例外对于立即停止处理和退出非常有用。
如果我返回HttpResponseMessage,请求将很乐意继续其余的处理并返回404.主要区别在于是否结束请求。
在.NET Web API 2中,您还可以从IHttpActionResult
返回ApiController
。是停止请求传播还是与HttpResponseMessage
类似?
谢谢;)
答案 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
。与直接从行动中做到这一点没什么不同。