当将 HttpClientHandler 传递给 HttpClient 时,会调用哪个 SendAsync 方法?

9

大多数自定义请求的属性都在HttpClientHandler中定义,这个类是HttpMessageHandler的子类,该类定义如下:

public abstract class HttpMessageHandler : IDisposable
{
  protected internal abstract Task<HttpResponseMessage> SendAsync
    (HttpRequestMessage request, CancellationToken cancellationToken);
  public void Dispose();
  protected virtual void Dispose (bool disposing);
}

书籍《C#5.0入门经典》指出在调用HttpClient的SendAsync方法时,HttpMessageHandler中的SendAsync方法被调用。但是HttpClient类也定义了一个SendAsync方法,当我们在HttpClient实例上调用此方法时,会调用哪个SendAsync方法呢?


3
总结你的问题:HttpClient有一个SendAsync方法。HttpMessageHandler有一个SendAsync方法(被HttpClientHandler重写)。HttpClient.SendAsync调用HttpMessageHandler.SendAync。问题出在哪里? - dtb
你的意思是HttpClient.SendAsync调用HttpMessageHandler的SendAsync方法,而不是它自己的方法吗? - Allen4Tech
当您调用HttpClient.SendAsync时,它会执行HttpClient.SendAsync。当执行HttpClient.SendAsync时,它会调用HttpMessageHandler.SendAsync。 - dtb
@AllenLi-AI3 请阅读 MSDN 上的 抽象类重写 - Soner Gönül
1个回答

6
这是基本的情况:
HttpMessageInvoker和HttpClient
class HttpMessageInvoker
{
    private HttpMessageHandler handler;

    public HttpMessageInvoker(HttpMessageHandler handler)
    {
        this.handler = handler;
    }

    public virtual void SendAsync()
    {
        Console.WriteLine("HttpMessageInvoker.SendAsync");
        this.handler.SendAsync();
    }
}

class HttpClient : HttpMessageInvoker
{
    public HttpClient(HttpMessageHandler handler)
        : base(handler)
    {
    }

    public override void SendAsync()
    {
        Console.WriteLine("HttpClient.SendAsync");
        base.SendAsync();
    }
}

HttpMessageHandler & HttpClientHandler

abstract class HttpMessageHandler
{
    protected internal abstract void SendAync();
}

class HttpClientHandler : HttpMessageHandler
{
    protected internal override void SendAync()
    {
        Console.WriteLine("HttpClientHandler.SendAsync");
    }
}

如果您在一个HttpClient实例上调用SendAsync方法,那么该方法将被执行。该方法会从HttpMessageInvoker中调用SendAsync方法。该方法会再次调用一个HttpMessageHandler实例的SendAsync方法。HttpMessageHandler是抽象类; HttpClientHandler通过覆盖它提供了一个具体实现的SendAsync方法。

示例:

var handler = new HttpClientHandler();
var client = new HttpClient(handler);
client.SendAsync();

Output:

HttpClient.SendAsync
HttpMessageInvoker.SendAsync
HttpClientHandler.SendAsync

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接