为何微软可调用SocketsHttpHandler受保护方法,我却无法编译?
问题
我尝试仿照GitHub上微软HttpClientHandler的实现方式,创建一个继承自HttpMessageHandler的自定义类InternetClientHandler。但编写代码时发现,调用_socketsHttpHandler.SendAsync(request, cancellationToken)会编译报错,原因是SocketsHttpHandler的SendAsync方法为受保护方法。同样的实现逻辑在微软代码中可行,为何我的代码不行?这是否是扩展方法?若是,为何智能感知未提示对应的using指令?
代码示例:
public class InternetClientHandler : HttpMessageHandler { private readonly SocketsHttpHandler _socketsHttpHandler; public InternetClientHandler() { _socketsHttpHandler = new SocketsHttpHandler(); } protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { return _socketsHttpHandler.SendAsync(request, cancellationToken); //ERROR } }
解决方案
- 微软代码可行的核心原因:.NET Core 2.1+版本中,微软的
HttpClientHandler本身就是SocketsHttpHandler的子类,子类天然有权限调用父类的受保护方法。而你的InternetClientHandler仅继承了HttpMessageHandler,并非SocketsHttpHandler的子类,所以无法访问其受保护的SendAsync方法。 - 不是扩展方法:
SocketsHttpHandler的SendAsync是类自身的受保护实例方法,不存在对应的扩展方法,因此智能感知不会提示任何相关using指令。 - 两种解决思路:
- 直接让自定义类继承
SocketsHttpHandler,这样就能合法重写并调用父类的SendAsync方法:public class InternetClientHandler : SocketsHttpHandler { protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // 插入你的自定义处理逻辑 return base.SendAsync(request, cancellationToken); } } - 如果必须继承
HttpMessageHandler,可以将SocketsHttpHandler作为内部委托处理器,但由于SocketsHttpHandler没有公开的发送方法,这种场景下第一种方案更合理。
- 直接让自定义类继承
内容的提问来源于stack exchange,提问作者Max Jacobi
相关产品推荐
相关产品推荐

