All*_*ech 8 c# httpclient .net-4.5
定义请求的大多数属性都是定义的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);
}
Run Code Online (Sandbox Code Playgroud)
书中<C#5.0 in a nutshell>说,SendAsync在方法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();
}
}
Run Code Online (Sandbox Code Playgroud)
HttpMessageHandler和HttpClientHandler
abstract class HttpMessageHandler
{
protected internal abstract void SendAync();
}
class HttpClientHandler : HttpMessageHandler
{
protected internal override void SendAync()
{
Console.WriteLine("HttpClientHandler.SendAsync");
}
}
Run Code Online (Sandbox Code Playgroud)
所以,如果你SendAsync在一个HttpClient情况下,该方法被执行。该SendAsync方法从中调用方法HttpMessageInvoker。此方法调用实例的SendAsync方法HttpMessageHandler。HttpMessageHandler是抽象的;通过覆盖HttpClientHandler抽象SendAync方法提供了具体的实现。
例:
var handler = new HttpClientHandler();
var client = new HttpClient(handler);
client.SendAsync();
Run Code Online (Sandbox Code Playgroud)
输出:
HttpClient.SendAsync HttpMessageInvoker.SendAsync HttpClientHandler.SendAsync