Какой метод SendAsync вызывается, когда HttpClientHandler передается HttpClient
большинство свойств для настройки запросов, определенных в 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);
}
книги <C#5.0 in a nutshell>
добавил SendAsync
метод HttpMessageHandler
вызывается, когда мы называем HttpClient
' s SendAsync
метод. Но ... --6--> класс также определяет SendAsync
метод, когда мы вызываем этот метод на экземпляре HttpClient
, который SendAsync
называется?
1 ответов
вот что происходит по существу:
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");
}
}
так что если вы называете SendAsync
на HttpClient
экземпляр, этот метод выполняется. Метод вызывает SendAsync
метод HttpMessageInvoker
. Этот метод вызывает SendAsync
метод a HttpMessageHandler
экземпляра. HttpMessageHandler
абстрактен; HttpClientHandler
обеспечивает конкретную реализацию аннотация SendAync
метод, переопределяя его.
пример:
var handler = new HttpClientHandler();
var client = new HttpClient(handler);
client.SendAsync();
выход:
HttpClient.SendAsync HttpMessageInvoker.SendAsync HttpClientHandler.SendAsync