将HttpClientHandler传递给HttpClient时调用哪个SendAsync方法

All*_*ech 8 c# httpclient .net-4.5

定义请求的大多数属性都是定义的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);
}
Run Code Online (Sandbox Code Playgroud)

书中<C#5.0 in a nutshell>说,SendAsync在方法HttpMessageHandler时,我们称之为叫HttpClientSendAsync方法.但是HttpClient该类还定义了一个SendAsync方法,当我们呼吁的一个实例这种方法HttpClient,这SendAsync是叫什么?

dtb*_*dtb 5

本质上是这样的:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

HttpMessageHandler和HttpClientHandler

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

class HttpClientHandler : HttpMessageHandler
{
    protected internal override void SendAync()
    {
        Console.WriteLine("HttpClientHandler.SendAsync");
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,如果你SendAsync在一个HttpClient情况下,该方法被执行。该SendAsync方法从中调用方法HttpMessageInvoker。此方法调用实例的SendAsync方法HttpMessageHandlerHttpMessageHandler是抽象的;通过覆盖HttpClientHandler抽象SendAync方法提供了具体的实现。

例:

var handler = new HttpClientHandler();
var client = new HttpClient(handler);
client.SendAsync();
Run Code Online (Sandbox Code Playgroud)

输出:

HttpClient.SendAsync
HttpMessageInvoker.SendAsync
HttpClientHandler.SendAsync