Max*_*obi 1 .net c# dotnet-httpclient
我正在尝试创建派生类,就像这里HttpMessageHandler所做的那样。我一开始就绊倒了,到目前为止我的代码:
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
}
}
Run Code Online (Sandbox Code Playgroud)
这是 Microsoft 实现的精确副本,HttpClientHandler但由于受保护,该方法无法编译_socketsHttpHandler.SendAsync。为什么它在 MS 的代码中有效,但在我的代码中无效?它是某种扩展方法吗?如果是这样,那么为什么 Intelli Sense 不提供帮助来插入正确的使用呢?SendAsyncSocketsHttpHandler
您无法访问,SocketsHttpHandler.SendAsync因为它被标记为protected internal。这意味着您要么需要位于同一个程序集中(即微软的代码),要么需要从它继承。并且您无法继承,因为它被标记为sealed.
相反,您应该继承自DelegatingHandler,它是同一程序集的一部分,因此能够调用它。这正是针对这种场景而设计的。
public class InternetClientHandler : DelegatingHandler
{
public InternetClientHandler() : base(new SocketsHttpHandler())
{
// change InnerHandler properties here
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// do stuff
return await base.SendAsync(request, cancellationToken); // will call InnerHandler.SendAsync
}
}
Run Code Online (Sandbox Code Playgroud)