【发布时间】:2013-09-10 22:50:34
【问题描述】:
DelegatingHandler 继承自 HttpMessageHandler。但是,我不明白其中的区别,因为您必须实现相同的方法 SendAsync 才能使两者都起作用。
这两个Handler有什么区别?我应该什么时候使用它们?
【问题讨论】:
DelegatingHandler 继承自 HttpMessageHandler。但是,我不明白其中的区别,因为您必须实现相同的方法 SendAsync 才能使两者都起作用。
这两个Handler有什么区别?我应该什么时候使用它们?
【问题讨论】:
如果您熟悉 ASP.NET,那么 HTTP 处理程序和模块就是一个很好的类比。如果实现HttpMessageHandler,则实现Send 和SendAsync 方法并返回响应或响应的承诺。这类似于 Http 处理程序。如果您实现 DelegatingHandler 并将其添加到 config.MessageHandlers 集合中,您的类将在管道中运行,并有机会查看请求和响应并对其做出反应,就像 HTTP 模块一样。 DelegatingHandler 也是一个HttpMessageHandler,除了作为SendAsync 实现的一部分,它只是调用内部处理程序的SendAsync。内部处理程序会做同样的事情,你会得到中国盒子或俄罗斯娃娃的效果。 HttpServer,管道开始的地方本身就是DelegatingHandler。
【讨论】:
差异非常微妙。 @Badri 给了你一个很好的快速解释。
看着at this poster,你就会明白它的全部含义。请记住,当您创建自己的 DelegatingHandlers 时,您不会弄乱任何不是 HTTP 的东西。在 POST 的情况下,这不是玩 BODY 的地方。例如。
您可以做的一件有用的事情是在管道中尽早检测到标头中不存在令牌,然后您可以立即终止请求并创建 StatusCode.Forbidden 响应。当然,也许一个简单的网站不需要它。简直是矫枉过正。但是,如果您每分钟收到数百万次调用,它会非常方便,因为它发生在控制器实际实例化之前。
只有少数情况下您确实需要它。或者说客户端进行其余调用,只能进行 GET 和 POST,但在标头中指定 X-Method-Override = PUT,然后您可以此时将请求方法从 POST 修改为 PUT,以便您的控制器/action 调度程序创建正确的实例并调用正确的操作。
这是有趣的海报。打印出来:D
【讨论】: