12

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

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

4

2 回答 2

22

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

于 2013-09-06T19:05:21.103 回答
1

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

看看这张海报,你就会明白它的全部含义。请记住,当您创建自己的 DelegatingHandlers 时,您不会搞乱任何不是特定 HTTP 的东西。在 POST 的情况下,这不是玩 BODY 的地方。例如。

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

只有少数情况下您确实需要它。或者说客户端进行其余调用,只能进行 GET 和 POST,但在标头中指定 X-Method-Override = PUT,然后您可以此时将请求方法从 POST 修改为 PUT,以便您的控制器/action 调度程序创建正确的实例并调用正确的操作。

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

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

于 2016-01-06T15:07:22.963 回答