不知何故,微软正在使用 SocketsHttpHandler 的受保护方法,但我不能

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

Cha*_*ace 5

您无法访问,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)