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 in a nutshell>は、のSendAsyncメソッドHttpMessageHandlerを呼び出すときにHttpClientのメソッドが呼び出されると述べていSendAsyncます。しかし、このHttpClientクラスは、?というインスタンスでSendAsyncこのメソッドを呼び出すときに、メソッドも定義します。HttpClientSendAsync

4

1 に答える 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");
    }
}

したがってSendAsyncHttpClientインスタンスを呼び出すと、そのメソッドが実行されます。SendAsyncメソッドはからメソッドを呼び出しますHttpMessageInvoker。このメソッドはSendAsyncHttpMessageHandlerインスタンスのメソッドを呼び出します。HttpMessageHandler抽象的です。抽象メソッドをオーバーライドすることによりHttpClientHandler、具体的な実装を提供します。SendAync

例:

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

出力:

HttpClient.SendAsync
HttpMessageInvoker.SendAsync
HttpClientHandler.SendAsync
于 2013-01-07T08:53:13.683 に答える