我认为@GlennBlock 在技术上是错误的。抛出 HttpResponseException 与返回 HttpResponseMessage 没有任何明显不同。
这是source code 提供的 ASP.NET Web API 中使用的模式:
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 工厂,您可以在其中编写一次并通过多种操作方法使用它。在这种情况下,您可以从IHttpActionResult 中抛出HttpResponseException。这与直接从动作中进行并没有什么不同。