我决定修复本机 HttpClient 的门框。假设所有方法都收敛到 SendAsync 是合理的,这意味着您需要在 heir 中重新定义它,甚至虚拟它。
但事实证明,它的重载只有一个是虚的,HttpClient的内部方法要经过其他重载,因此不落入继承者。
这是 HttpClient 类的开发人员的谎言,还是我在继承中遗漏了什么?如果重载它没有用,为什么要声明一个单一的重载 virtual 呢?
我决定修复本机 HttpClient 的门框。假设所有方法都收敛到 SendAsync 是合理的,这意味着您需要在 heir 中重新定义它,甚至虚拟它。
但事实证明,它的重载只有一个是虚的,HttpClient的内部方法要经过其他重载,因此不落入继承者。
这是 HttpClient 类的开发人员的谎言,还是我在继承中遗漏了什么?如果重载它没有用,为什么要声明一个单一的重载 virtual 呢?
重点是该方法
SendAsync
不打算扩展。而且不是virtual,而是基类的override方法HttpMessageInvoker
。HttpClient
它被设想为通过HttpMessageHandler
/从中扩展DelegatingHandler
(通过继承拥有自己的实现),您可以制作一系列装饰器来顺序处理请求。例子:
问题 1:
HttpClient
超时时抛出OperationCanceledException
,这很混乱,需要手动检查“是否真的有取消”我们写
FixTimeoutHandler
来替换异常。唉,一个SendAsync
陌生人被扔进了一个陌生人( 这里假设超时的实现是建立在上面的),所以我们将原生的扔进构造函数并检查“是否有真正的取消”CancellationToken
CancellationTokenSource
CancellationToken
问题 2:在网络错误的情况下重试请求(包括我们
FixTimeoutHandler
在处理程序中定义为网络错误的超时。任何其他错误都会在堆栈中飞得更高。简化实施
HttpClientHandler
发出 http 请求的链中的最后一个。聚集在一起:
还有一个工厂类HttpClientFactory用于收集处理程序链,但它位于一个单独的程序集中,需要通过 nuget 安装