DelegatingHandler
继承自HttpMessageHandler
。但是,我不明白这种差异,因为你必须实现相同的方法,SendAsync
才能使两者都有效。
这两个处理程序有什么区别?我什么时候应该使用每一个?
答案 0 :(得分:18)
如果您熟悉ASP.NET,那么一个很好的类比将是HTTP处理程序和模块。如果您实施HttpMessageHandler
,则实施Send
和SendAsync
方法并返回响应或响应的承诺。这类似于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