更改HttpClient中的HttpMessageHandler

8

HttpClient 在两个构造函数中都需要一个 HttpMessageHandler 参数。

在不创建新的 HttpClient 实例的情况下,有没有简单的方法可以更改处理程序?


1
使用装饰器模式或外观模式创建一个从HttpMessageHandler派生的包装处理程序。在此实现中添加一个方法来设置内部处理程序。现在,使用变量将您的处理程序传递给HttpClient,并使用它来更改内部处理程序。 - Gurpreet
2个回答

2
如果您保留对实际Handler的引用,则可以在创建并插入到HttpClient之后修改Handler。但是不确定是否可以将其更改为另一种Handler类型。
很遗憾,您无法通过HttpClient引用(例如HttpClient.Handler)检索Handler,但上述提到的方法可行。

2
不起作用。看起来他们只是复制而不是通过引用传递。唯一的方法是重新实例化HttpClient。 - Vedran Mandić

-1

据我所知,最好的方法是检查默认的HttpClientFactory源代码,它实际上执行处理程序池等操作。然后创建自己的IHttpClientFactory实现,例如只需以一种方式更改默认实现,以便您可以将HttpClient发送到方法以获取其处理程序作为返回值的引用。当然,由于默认实现的池和过期机制,这只是一个快速想法,可能不是最优的,但默认实现提供了对机制的深入了解。

例如,这使我创建了自己的处理程序类型,允许更改分配的IWebProxy,进行选择性DNS请求,分配DNS和IP覆盖等操作。顺便说一句,依赖于IHttpClientFactory的原则会导致关注点的良好分离。

例如,您可以使用不同的预定义ClientHandler类型和属性进行池化,并仅向GetClient调用添加IOption,其中包含RequestedHandlerType、IHttpClientMessageHandlerOptions等,然后让整个DI机制在幕后完成其可靠的工作。通过实际请求具有在DI容器中定义的选项的处理程序,您将拥有比即时更改更清晰的代码库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接