HttpClient客户端消息处理程序

时间:2014-05-26 17:28:21

标签: asp.net asp.net-web-api

在进行网络API呼叫时,HttpClient自定义客户端消息处理程序会将自己插入客户端管道中。此信息来自this article
作者说,这些消息处理程序会在发出请求时以及从服务器收到响应时开始执行。

我理解这些客户端消息处理程序的角色,因为sendAsync方法提供了请求对象,因此请求正从客户端发送到服务器。可以添加自定义请求标头等。

我不理解这些消息处理程序在从服务器收到响应后的用处,因为sendAsync方法不提供对响应对象的访问。所以,我不确定这些客户端消息处理程序如何在请求的返回途中有用。

我显然在这里遗漏了一些东西。

1 个答案:

答案 0 :(得分:0)

实际上,您确实可以访问消息处理程序中的响应消息。例如,在以下处理程序中,我正在记录传出请求和传入响应。现在只要我使用这个HttpClient实例,通过它进行的所有调用都会写入请求和响应的痕迹。

HttpClient client = new HttpClient(new LoggingHandler(new HttpClientHandler()));

public class LoggingHandler : DelegatingHandler
{
    public LoggingHandler(HttpMessageHandler innerHandler)
        : base(innerHandler)
    {
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        Console.WriteLine("Request:");
        Console.WriteLine(request.ToString());
        if (request.Content != null)
        {
            Console.WriteLine(await request.Content.ReadAsStringAsync());
        }
        Console.WriteLine();

        HttpResponseMessage response = await base.SendAsync(request, cancellationToken);

        Console.WriteLine("Response:");
        Console.WriteLine(response.ToString());
        if (response.Content != null)
        {
            Console.WriteLine(await response.Content.ReadAsStringAsync());
        }
        Console.WriteLine();

        return response;
    }
}