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