2013-01-07 19 views
5

Większość właściwości dostosowywania wnioski zostały zdefiniowane w HttpClientHandler ta klasa jest podklasą HttpMessageHandler klasa zdefiniowana tak:Która metoda SendAsync nazywa gdy HttpClientHandler jest przekazywana do HttpClient

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

Książka <C#5.0 in a nutshell> powiedział, że metoda SendAsync w HttpMessageHandler jest wywoływana, gdy wywołujemy metodę HttpClient 'SendAsync. Ale klasa HttpClient definiuje również metodę SendAsync, kiedy nazywamy tę metodę instancją HttpClient, która nazywa się SendAsync?

+2

Podsumowując swoje pytanie: httpclient ma metodę SendAsync. HttpMessageHandler ma metodę SendAsync (overriden by HttpClientHandler). HttpClient.SendAsync wywołuje HttpMessageHandler.SendAync. Jaki jest problem? – dtb

+0

Masz na myśli HttpClient.SendAsync wywołuje metodę SendAsync HttpMessageHandler, a nie własną? – Allen4Tech

+0

Po wywołaniu HttpClient.SendAsync wykonywana jest procedura HttpClient.SendAsync. Po uruchomieniu HttpClient.SendAsync wywoływana jest metoda HttpMessageHandler.SendAsync. – dtb

Odpowiedz

4

To, co dzieje się w zasadzie:

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

Więc jeśli zadzwonisz SendAsync w instancji HttpClient, ta metoda jest wykonywana. Metoda nazywa metodę SendAsync z HttpMessageInvoker. Ta metoda wywołuje metodę SendAsync instancji. HttpMessageHandler jest abstrakcyjna; HttpClientHandler zapewnia konkretną implementację abstrakcyjnej metody poprzez jej przesłonięcie.

Przykład:

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

wyjściowa:

 
HttpClient.SendAsync 
HttpMessageInvoker.SendAsync 
HttpClientHandler.SendAsync 
Powiązane problemy