2013-01-07 6 views
5

Anfragen meisten Eigenschaften für die Anpassung in HttpClientHandler definiert sind, diese Klasse eine Unterklasse von HttpMessageHandler ist, die Klasse wie folgt definiert:Welche SendAsync Methode wird aufgerufen, wenn ein HttpClientHandler zu Httpclient übergeben wird

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

Das Buch <C#5.0 in a nutshell> sagte die SendAsync Methode in HttpMessageHandler wird aufgerufen, wenn wir HttpClient 's SendAsync Methode aufrufen. Aber die HttpClient Klasse definiert auch eine SendAsync Methode, wenn wir diese Methode auf eine Instanz von HttpClient aufrufen, die SendAsync heißt?

+2

Ihre Frage Zusammengefasst: Httpclient hat eine Methode SendAsync. HttpMessageHandler hat eine Methode SendAsync (von HttpClientHandler überschrieben). HttpClient.SendAsync ruft HttpMessageHandler.SendAync auf. Was ist das Problem? – dtb

+0

Meinst du, HttpClient.SendAsync ruft die SendAsync-Methode von HttpMessageHandler auf, nicht ihre eigene? – Allen4Tech

+0

Wenn Sie HttpClient.SendAsync aufrufen, wird HttpClient.SendAsync ausgeführt. Wenn HttpClient.SendAsync ausgeführt wird, ruft es HttpMessageHandler.SendAsync auf. – dtb

Antwort

4

Dies ist, was im Wesentlichen geschieht:

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

wenn Sie anrufenSo 0 auf einer HttpClient Instanz wird diese Methode ausgeführt. Die Methode ruft die Methode SendAsync von HttpMessageInvoker auf. Diese Methode ruft die SendAsync-Methode einer HttpMessageHandler Instanz auf. HttpMessageHandler ist abstrakt; HttpClientHandler bietet eine konkrete Implementierung der abstrakten SendAync Methode durch Überschreiben.

Beispiel:

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

Ausgang:

 
HttpClient.SendAsync 
HttpMessageInvoker.SendAsync 
HttpClientHandler.SendAsync 
Verwandte Themen