C# 返回的IHttpActionResult是否停止请求执行

C# 返回的IHttpActionResult是否停止请求执行,c#,asp.net-web-api,httpresponse,asp.net-web-api2,C#,Asp.net Web Api,Httpresponse,Asp.net Web Api2,@GlennBlock提到抛出HttpResponseException会立即停止请求执行,而返回HttpResponseMessage不会停止请求传播(据我所知) 该异常有助于立即停止处理并退出 相反,如果我返回HttpResponseMessage,请求将愉快地继续它的其余处理并返回404。主要区别在于是否结束请求 在.NET Web API 2中,您还可以从ApiController返回IHttpActionResult。它是停止请求传播还是与HttpResponseMessage类似 谢

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

该异常有助于立即停止处理并退出

相反,如果我返回HttpResponseMessage,请求将愉快地继续它的其余处理并返回404。主要区别在于是否结束请求

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


谢谢;)

我认为@GlennBlock在技术上是错误的。抛出一个
HttpResponseException
与返回一个
HttpResponseMessage
没有任何明显不同

以下是ASP.NET Web API中使用的模式:

在管道中的这一点上,如果您抛出了一个
HttpResponseException
,它将得到与返回
HttpResponseMessage
相同的处理。。。它的行为完全相同

您会注意到,当使用Visual Studio进行调试时,调试器将在抛出的HttpResponseException上中断(因为捕获不会在用户代码中发生)。若这是一个预期的错误,通常发生在您的网站正常运行,然后这可能会变得非常恼人!在这种情况下,您可能希望返回带有
HttpResponseMessage
的错误代码

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

我能说的唯一的另一个区别是抛出一个
HttpResponseException
允许您使用
ieexceptionfilter
捕获它。与将操作筛选器或授权筛选器应用于方法或控制器的方式类似,您可以应用异常筛选器来处理所有异常。也许您想将它们记录到数据库中。显然,应用属性过滤器要比在每个动作方法中编写try/catch容易得多

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


ihttpackationresult
用于创建
HttpResponseMessage
。可以将其视为一个
HttpResponseMessage
工厂,在这里您可以编写一次并通过多种操作方法使用它。在这种情况下,您可以从
IHttpActionResult
中抛出
HttpResponseException
。这与直接从操作中执行没有什么不同。

对调试问题有很好的了解。我认为参考问题的要点是HttpResponseException会立即停止请求处理,而返回HttpResponseMessage则不会。此外,实际上,我想知道IHttpActionResult与HttpResponseException和HttpResponseMessage相比是如何工作的。@NikolaiSamteladze返回
HttpResponseMessage
实际上是请求链中的最后一件事。此处没有要停止的处理。使用
IHttpActionResult
创建
HttpResponseMessage
。可以将其视为一个
HttpResponseMessage
工厂,在这里您可以编写一次并通过多种操作方法使用它。在这种情况下,您可以从
IHttpActionResult
中抛出
HttpResponseException
。这与直接执行操作没有任何区别。因此,
return Request.CreateResponse(HttpStatusCode.OK)
将立即停止请求处理,并且将执行此语句下面的非控制器代码,对吗?
try
{
    return await SendAsyncCore(request, cancellationToken);
}
catch (HttpResponseException httpResponseException)
{
    return httpResponseException.Response;
}
catch (Exception exception)
{
    exceptionInfo = ExceptionDispatchInfo.Capture(exception);
}