.net 不知何故,微软正在使用SocketsHttpHandler的protected方法,但我不能

yqhsw0fo  于 2023-05-23  发布在  .NET
关注(0)|答案(1)|浏览(139)

我试图从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
        }
    }

这是微软的HttpClientHandler实现的精确副本,但方法_socketsHttpHandler.SendAsync无法编译,因为SocketsHttpHandlerSendAsync受到保护。为什么它在MS的代码中有效,而在我的代码中无效?这是一种扩展方法吗?如果是这样,那么为什么智能感知不提供帮助,以插入正确的使用?

3ks5zfa0

3ks5zfa01#

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

相关问题