何时使用HttpMessageHandler vs ActionFilter?

看来这两个有着相似的目的。 看到一些例子,比如什么时候使用优势和劣势,以及指出哪些是主要的差异,我们感到非常高兴。

他们两人的主要区别是他们的重点。 消息处理程序适用于所有的HTTP请求。 他们执行HTTP中介的function。 filter仅适用于分派到应用filter的特定控制器/操作的请求。

如果希望将行为应用于绝大多数请求,则应该使用MessageHandler。 filter只适用于某些资源时应该使用。

在这里输入图像说明

处理程序和动作filter之间的巨大差异就是执行它们的阶段。 操作filter在控制器分派和模型绑定发生后执行,因此您可以与正在处理请求的控制器实例进行交互,也可以直接访问传递给操作方法的types模型对象。 我已经使用这种方法来执行请求/响应值的高级logging – 因为我可以在控制器上,我可以logging关于如何处理请求的附加信息。

消息处理程序在进程的早期执行,并且比filter更接近原始请求/响应值(对比在处理程序中使用的HttpRequestMessage / HttpResponseMessage对象与filter中可用的更为丰富的HttpActionContext和HttpActionExecutedContext对象)。 这使得它们对于某些活动可能更有效率,例如,如果您试图确定是否需要尽早终止请求。 如果你知道这个请求应该被拒绝,一个处理程序将允许你在WebApi基础结构去实例化控制器,执行模型绑定之前做到这一点。

另一个区别是处理程序是链接的,而且你对链接的执行有更多的控制。 尽pipe按顺序调用filter,但在一个filter中设置响应将有效地结束请求,从而阻止列表中的下一个filter被执行。 例如,如果您的第一个筛选器在您的模型为空时返回错误请求,并且第二个筛选器logging该请求,那么在第一个筛选器生成错误请求后,将不会执行第二个筛选器。 使用一个处理程序,它仍然是可能的(尽pipe不一定是明智的!)来调用内部处理程序,并允许处理程序链正常运行。