2013-01-07 20 views
5

अनुरोध अनुकूलित करने के लिए गुण के अधिकांश HttpClientHandler में परिभाषित कर रहे हैं, इस वर्ग के HttpMessageHandler का एक उपवर्ग है, वर्ग इस तरह परिभाषित किया गया:कौन सा SendAsync विधि है जब एक HttpClientHandler 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); 
} 

किताब <C#5.0 in a nutshell> ने विधि HttpMessageHandler में विधि कहा है जब हम HttpClient की SendAsync विधि को कॉल करते हैं। लेकिन HttpClient कक्षा SendAsync विधि को भी परिभाषित करती है, जब हम इस विधि को HttpClient के उदाहरण पर कॉल करते हैं, जो SendAsync कहलाता है?

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

तो अगर आपफोन:

+2

अपने प्रश्न संक्षेप में: HttpClient एक विधि SendAsync है। HttpMessageHandler में एक तरीका SendAsync है (HttpClientHandler द्वारा overriden)। HttpClient.SendAsync HttpMessageHandler.SendAync को कॉल करता है। समस्या क्या है? – dtb

+0

क्या आपका मतलब है HttpClient.SendAsync HttpMessageHandler की SendAsync विधि को कॉल करता है, न कि स्वयं? – Allen4Tech

+0

जब आप HttpClient.SendAsync को कॉल करते हैं, तो HttpClient.SendAsync निष्पादित किया जाता है। जब HttpClient.SendAsync निष्पादित किया जाता है, तो यह HttpMessageHandler.SendAsync को कॉल करता है। – dtb

उत्तर

4

यह वही है अनिवार्य रूप से हो रहा है है HttpClient उदाहरण पर 0, उस विधि को निष्पादित किया गया है। विधि HttpMessageInvoker से SendAsync विधि को कॉल करती है। यह विधि उदाहरण की SendAsync विधि को कॉल करती है। HttpMessageHandler सार है; HttpClientHandler इसे ओवरराइड करके अमूर्त SendAync विधि का एक ठोस कार्यान्वयन प्रदान करता है।

उदाहरण:

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

आउटपुट:

 
HttpClient.SendAsync 
HttpMessageInvoker.SendAsync 
HttpClientHandler.SendAsync 
संबंधित मुद्दे