Какой метод SendAsync вызывается, когда HttpClientHandler передается HttpClient

большинство свойств для настройки запросов, определенных в 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 in a nutshell> добавил SendAsync метод HttpMessageHandler вызывается, когда мы называем HttpClient ' s SendAsync метод. Но ... --6--> класс также определяет SendAsync метод, когда мы вызываем этот метод на экземпляре HttpClient, который SendAsync называется?

1 ответов


вот что происходит по существу:

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");
    }
}

так что если вы называете SendAsync на HttpClient экземпляр, этот метод выполняется. Метод вызывает SendAsync метод HttpMessageInvoker. Этот метод вызывает SendAsync метод a HttpMessageHandler экземпляра. HttpMessageHandler абстрактен; HttpClientHandler обеспечивает конкретную реализацию аннотация SendAync метод, переопределяя его.

пример:

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

выход:

HttpClient.SendAsync
HttpMessageInvoker.SendAsync
HttpClientHandler.SendAsync