【问题标题】:When to use HttpMessageHandler vs ActionFilter?何时使用 HttpMessageHandler 与 ActionFilter?
【发布时间】:2012-06-22 19:03:04
【问题描述】:

看来这两者的目的是相似的。很高兴看到一些示例何时使用一种方法,优缺点,并指出主要区别是什么。

【问题讨论】:

标签: asp.net-web-api


【解决方案1】:

他们两者之间的主要区别在于他们的重点。信息 处理程序适用于所有 HTTP 请求。他们执行功能 HTTP 中介。过滤器仅适用于以下请求 分派到过滤器所在的特定控制器/动作 已申请。

当你想要行为是你应该使用 MessageHandlers 适用于绝大多数请求。过滤器应在以下情况下使用 它们仅适用于某些资源。

【讨论】:

  • 过滤器也可以应用于所有 HTTP 请求,如果它们被添加为全局过滤器。
  • 过滤器可以全局应用,MessageHandlers 可以应用到每个路由。所以我不认为这个答案特别令人满意。
  • 我认为使用过滤器的一个缺点是 ParameterBinding 将在 OnActionExecuting 之前发生,因此如果您想在将数据传递给操作之前对其进行操作,则必须创建一些新的 MediaTypeFormatters。
【解决方案2】:

处理程序和操作过滤器之间的一个很大区别在于它们的执行阶段。动作过滤器在控制器分派和模型绑定发生后执行,因此您可以与处理请求的控制器实例交互,以及直接访问传递给动作方法的类型化模型对象。我已经使用这种方法来执行请求/响应值的高级记录 - 因为我可以访问控制器,所以我能够记录有关如何处理请求的其他信息。

消息处理程序在流程的早期执行,并且比过滤器更接近原始请求/响应值(对比处理程序中使用的 HttpRequestMessage/HttpResponseMessage 对象与过滤器中可用的更丰富的 HttpActionContext 和 HttpActionExecutedContext 对象)。这使得它们对某些活动可能更有效,例如,如果您尝试确定是否需要提前终止请求。如果您知道该请求应该被拒绝,则处理程序将允许您在 WebApi 基础架构着手实例化控制器、执行模型绑定等工作之前执行此操作。

另一个区别是处理程序是链式的,您可以更好地控制链的执行方式。虽然过滤器是按顺序调用的,但在一个过滤器中设置响应将有效地结束请求,从而阻止执行列表中的下一个过滤器。例如,如果您的第一个过滤器在您的模型为空时返回错误请求,并且有第二个过滤器来记录请求,那么一旦第一个过滤器生成错误请求,您的第二个过滤器将不会执行。使用处理程序,仍然可以(尽管不一定可取!)调用内部处理程序并允许处理程序链正常运行。

【讨论】:

    猜你喜欢
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多