何时使用HttpMessageHandler vs ActionFilter?

fre*_*nky 49 asp.net-web-api

看来这两者有着相似的目的.很高兴看到一些例子何时使用其中一个,优点和缺点,以及指出哪些是关键差异.

Jef*_*aes 61

两者之间的主要区别在于他们的重点.消息处理程序应用于所有HTTP请求.它们执行HTTP中介的功能.过滤器仅适用于分派到应用过滤器的特定控制器/操作的请求.

如果希望将行为应用于绝大多数请求,则应使用MessageHandler.当它们仅适用于某些资源时,应使用过滤器.

在此输入图像描述

  • 过滤器也可以应用于所有HTTP请求,如果它们被添加为全局过滤器. (7认同)
  • 可以全局应用过滤器,并且可以按路由应用MessageHandler.所以我不认为这个答案特别令人满意. (6认同)
  • 这是从哪里来的? (2认同)
  • http://blogs.msdn.com/b/kiranchalla/archive/2012/05/05/asp-net-mvc4-web-api-stack-diagram.aspx (2认同)

Cla*_*eye 37

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

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

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