看来这两者的目的是相似的。很高兴看到一些示例何时使用一个而不是另一个,利弊,并指出主要区别是什么。
2 回答
他们两个之间的主要区别是他们的重点。消息处理程序适用于所有 HTTP 请求。它们执行 HTTP 中介的功能。过滤器仅适用于分派到应用过滤器的特定控制器/操作的请求。
当您希望将行为应用于绝大多数请求时,您应该使用 MessageHandlers。当过滤器仅适用于某些资源时,应使用过滤器。
处理程序和操作过滤器之间的一个很大区别是它们执行的阶段。动作过滤器在控制器分派和模型绑定发生后执行,因此您可以与处理请求的控制器实例交互,以及直接访问传递给动作方法的类型化模型对象。我已经使用这种方法来执行请求/响应值的高级记录 - 因为我可以访问控制器,所以我能够记录有关如何处理请求的其他信息。
消息处理程序在流程的早期执行,并且比过滤器更接近原始请求/响应值(将处理程序中使用的 HttpRequestMessage/HttpResponseMessage 对象与过滤器中可用的更丰富的 HttpActionContext 和 HttpActionExecutedContext 对象进行对比)。这使得它们对于某些活动可能更有效,例如,如果您尝试确定是否需要提前终止请求。如果您知道请求应该被拒绝,处理程序将允许您在 WebApi 基础设施着手实例化控制器、执行模型绑定等工作之前执行此操作。
另一个区别是处理程序是链式的,您可以更好地控制链的执行方式。尽管过滤器是按顺序调用的,但是在一个过滤器中设置响应将有效地结束请求,从而阻止执行列表中的下一个过滤器。例如,如果您的第一个过滤器在您的模型为空时返回错误请求,并且有第二个过滤器来记录请求,那么一旦第一个过滤器生成错误请求,您的第二个过滤器将不会执行。使用处理程序,仍然可以(尽管不一定可取!)调用内部处理程序并允许处理程序链正常运行。