【问题标题】:Does returning IHttpActionResult stop request execution返回 IHttpActionResult 是否会停止请求执行
【发布时间】:2013-11-08 15:09:01
【问题描述】:

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

该异常对于立即停止处理并退出很有用。

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

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

谢谢你;)

【问题讨论】:

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


    【解决方案1】:

    我认为@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。这与直接从动作中进行并没有什么不同。

    【讨论】:

    • 对调试问题的深入了解。我认为引用问题的重点是 HttpResponseException 立即停止请求处理,而返回 HttpResponseMessage 不会。
    • 另外,我真的想知道 IHttpActionResult 与 HttpResposeException 和 HttpResponseMessage 相比如何工作。
    • @NikolaiSamteladze 返回HttpResponseMessage 实际上是请求链中的最后一件事。此处没有要停止的处理。
    • 一个IHttpActionResult 用于创建一个HttpResponseMessage。将其视为HttpResponseMessage 工厂,您可以在其中编写一次并通过多种操作方法使用它。在这种情况下,您可以从IHttpActionResult 中抛出HttpResponseException。这与直接从动作中进行并没有什么不同。
    • 那么,return Request.CreateResponse(HttpStatusCode.OK) 将立即停止请求处理,并且该语句下面的非控制器代码将被执行,对吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多