2013-01-07 3 views
5

maggior parte delle proprietà per la personalizzazione richieste sono definiti in HttpClientHandler, questa classe è una sottoclasse di HttpMessageHandler, classe definita in questo modo:Quale metodo SendAsync viene chiamato quando un HttpClientHandler viene passato a 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); 
} 

Il libro <C#5.0 in a nutshell> viene chiamato il metodo SendAsync in HttpMessageHandler quando viene chiamato il metodo SendAsyncHttpClient. Ma la classe HttpClient definisce anche un metodo SendAsync, quando chiamiamo questo metodo su un'istanza di HttpClient, che viene chiamato SendAsync?

+2

In sintesi tua domanda: HttpClient ha un metodo di SendAsync. HttpMessageHandler ha un metodo SendAsync (sovrascritto da HttpClientHandler). HttpClient.SendAsync chiama HttpMessageHandler.SendAync. Qual è il problema? – dtb

+0

Intendi HttpClient.SendAsync chiama il metodo SendAsync di HttpMessageHandler, non il suo? – Allen4Tech

+0

Quando si chiama HttpClient.SendAsync, viene eseguito HttpClient.SendAsync. Quando viene eseguito HttpClient.SendAsync, chiama HttpMessageHandler.SendAsync. – dtb

risposta

4

Questo è ciò che accade essenzialmente:

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

Quindi, se si chiamano SendAsync su un'istanza HttpClient, tale metodo viene eseguito. Il metodo chiama il metodo SendAsync da HttpMessageInvoker. Questo metodo chiama il metodo SendAsync di un'istanza HttpMessageHandler. HttpMessageHandler è astratto; HttpClientHandler fornisce un'implementazione concreta del metodo astratto SendAync sovrascrivendolo.

Esempio:

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

uscita:

 
HttpClient.SendAsync 
HttpMessageInvoker.SendAsync 
HttpClientHandler.SendAsync