HttpMessageHandler与DelegatingHandler

时间:2013-09-06 18:44:51

标签: asp.net asp.net-web-api

DelegatingHandler继承自HttpMessageHandler。但是,我不明白这种差异,因为你必须实现相同的方法,SendAsync才能使两者都有效。

这两个处理程序有什么区别?我什么时候应该使用每一个?

2 个答案:

答案 0 :(得分:18)

如果您熟悉ASP.NET,那么一个很好的类比将是HTTP处理程序和模块。如果您实施HttpMessageHandler,则实施SendSendAsync方法并返回响应或响应的承诺。这类似于Http处理程序。如果您实现DelegatingHandler并将其添加到config.MessageHandlers集合,那么您的类将在管道中运行,并有机会查看请求和响应并对其做出响应,就像HTTP模块一样。 DelegatingHandler也是HttpMessageHandler,但作为SendAsync实现的一部分,它只调用内部处理程序的SendAsync。内部处理程序将执行相同的操作,您将获得中文框或俄罗斯玩偶效果。管道启动的HttpServer本身就是DelegatingHandler

答案 1 :(得分:1)

差异非常微妙。 @Badri给了你一个很好的快速解释。

at this poster,你会发现它的全部意义。请记住,当您创建自己的DelegatingHandler时,不要乱用任何不是特定HTTP内容的东西。在POST的情况下,这不是玩BODY的地方。例如。

您可以做的一件有用的事情是在管道中尽早检测到标头中没有令牌,然后您可以在那里终止请求并创建StatusCode.Forbidden响应。当然,也许一个简单的网站并不需要它。只是一个矫枉过正。但是如果你每分钟收到数百万个电话,它就会非常方便,因为它恰好在控制器实际实例化之前发生。

只有少数情况下你真正需要它。或者说客户端进行其余的调用,只能进行GET和POST,但是在标题中它指定了X-Method-Override = PUT,那么你可以在此时修改从POST到PUT的请求方法,这样您的控制器/操作调度员就可以创建正确的实例并调用正确的操作。

这是有趣的海报。打印它:D

http://www.asp.net/media/4071077/aspnet-web-api-poster.pdf

相关问题