Asp.net HttpMessageHandler与DelegatingHandler

Asp.net HttpMessageHandler与DelegatingHandler,asp.net,asp.net-web-api,Asp.net,Asp.net Web Api,DelegatingHandler继承自HttpMessageHandler。但是,我不理解其中的区别,因为您必须实现相同的方法,SendAsync,才能使这两种方法都起作用 这两个处理器有什么区别?我应该什么时候使用每一个呢?如果您熟悉ASP.NET,那么HTTP处理程序和模块就是一个很好的类比。如果实现HttpMessageHandler,则实现Send和sendsync方法并返回响应或响应承诺。这类似于Http处理程序。如果实现一个DelegatingHandler并将其添加到config

DelegatingHandler
继承自
HttpMessageHandler
。但是,我不理解其中的区别,因为您必须实现相同的方法,
SendAsync
,才能使这两种方法都起作用


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

如果您熟悉ASP.NET,那么HTTP处理程序和模块就是一个很好的类比。如果实现
HttpMessageHandler
,则实现
Send
sendsync
方法并返回响应或响应承诺。这类似于Http处理程序。如果实现一个
DelegatingHandler
并将其添加到
config.MessageHandlers
集合中,则类将在管道中运行,并有机会查看请求和响应,就像HTTP模块一样
DelegatingHandler
也是一个
HttpMessageHandler
,除了作为
SendAsync
实现的一部分,它只调用内部处理程序的
SendAsync
。内部处理器也会这样做,你会得到中国盒子或俄罗斯娃娃的效果
HttpServer
,管道开始的地方本身就是一个
DelegatingHandler

区别非常细微@巴德里很快给了你一个很好的解释

听着,你知道这是怎么回事。请记住,当您创建自己的delegatinghandler时,您不会处理任何非特定HTTP内容。这不是一个用来玩弄尸体的地方。比如说

您可以做的一件有用的事情是在管道中很早就检测到头中不存在令牌,然后您可以立即终止请求并创建一个StatusCode.Forbidden响应。当然,也许一个简单的网站并不需要它。只是过火了。但是,如果您每分钟收到数百万个呼叫,它会非常方便,因为它发生在控制器实际实例化之前

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

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


有人知道如何在web.config中配置消息处理程序吗