ASP.NET Core 6 HttpClient管道处理实例详解[18]有哪些关键揭秘?
- 内容介绍
- 文章标签
- 相关推荐
本文共计664个文字,预计阅读时间需要3分钟。
我们知道ASP.NET的核心是由中间件组成的请求处理管道,HttpClient也采用了类似的架构设计。HttpClient通过一组HttpMessageHandler对象来管理,这些HttpMessageHandler相当于ASP.NET的中间件。例如:
我们知道ASP.NET的核心就是由中间件组成的请求处理管道,HttpClient也采用了类似的设计。HttpClient管道由一组HttpMessageHandler对象构成,这些HttpMessageHandler相当于ASPNET的中间件。如下这些示例演示帮助我们更清楚地认识HttpMessageHandler处理管道。在《利用IHttpClientFactory工厂来创建HttpClient》之后,我们将关注点放到HttpClient对象上。我们知道ASP.NET的核心就是由中间件组成的请求处理管道,HttpClient也采用了类似的设计。HttpClient管道由一组HttpMessageHandler对象构成,这些HttpMessageHandler相当于ASPNET的中间件。如下这些示例演示帮助我们更清楚地认识HttpMessageHandler处理管道。(本篇提供的实例已经汇总到《ASP.NET Core 6框架揭秘-实例演示版》)
[S1208]HttpClient的默认管道结构[S1208]HttpClient的默认管道结构(源代码)
[S1209]定制HttpClient管道(源代码)
[S1210]针对HTTP调用的日志输出(>=Information)(源代码)
[S1211]针对HTTP调用的日志输出(>=Trace)(源代码)
接下来我们通过如下的演示程序使用IHttpClientFactory工厂创建了 一个HttpClient对象,并查看其管道依次由哪些类型的HttpMessageHandler对象组成。如代码片段所示,我们定义了一个辅助方法PrintPipeline方法以递归的形式将指定HttpMessageHandler对象及其下一个处理器的类型输出到控制台上。
using Microsoft.Extensions.DependencyInjection; using System.Reflection; var www.baidu.com”发送了一个GET请求。
using App; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; var services = new ServiceCollection().AddLogging(logging => logging .AddConsole() .AddSimpleConsole(options => options.IncludeScopes = true)); services.AddHttpClient(string.Empty).AddHttpMessageHandler(() => new DelayHttpMessageHanadler()); var www.baidu.com");
程序运行之后,我们会在控制台上看到如图3所示的四条日志。日志第一条和最后一条是LoggingScopeHttpMessageHandler输出的,它创建了一个日志范围,范围名称采用模板为“HTTP {Method} {URL}”,最后一条日志会输出针对整个管道上的调用耗时。第2条和第3条日志是LoggingHttpMessageHandler对象输出的,它们写入的时机分别是发送请求前和接收到请求后,最后一条还是输出两者之间的时间间隔,也就是面向网络传输的耗时。从输出的内容可以看出,两个耗时基本上相差三秒,刚好是我们注册的DelayHttpMessageHanadler对象模拟延时。
图3 诊断日志(Level >=Information)
由于在默认情况下只有等级不低于Information的日志才会输出到控制台上,所以看不到上述两个输出的更低等级(Trace)的日志。接下来我们对程序作如下的改动,通过添加日志过滤器输出所有等级的日志。
using App; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; var services = new ServiceCollection().AddLogging(logging => logging .SetMinimumLevel(LogLevel.Trace) .AddConsole() .AddSimpleConsole(options => options.IncludeScopes = true)); services.AddHttpClient(string.Empty).AddHttpMessageHandler(() => new DelayHttpMessageHanadler()); var www.baidu.com");
再次运行我们的演示程序,控制台上将会输出如图4所示的日志。我们可以看出LoggingScopeHttpMessageHandler和LoggingHttpMessageHandler会将请求和响应的报头写入到等级为Trace的日志之中。
图4 诊断日志(All)
本文共计664个文字,预计阅读时间需要3分钟。
我们知道ASP.NET的核心是由中间件组成的请求处理管道,HttpClient也采用了类似的架构设计。HttpClient通过一组HttpMessageHandler对象来管理,这些HttpMessageHandler相当于ASP.NET的中间件。例如:
我们知道ASP.NET的核心就是由中间件组成的请求处理管道,HttpClient也采用了类似的设计。HttpClient管道由一组HttpMessageHandler对象构成,这些HttpMessageHandler相当于ASPNET的中间件。如下这些示例演示帮助我们更清楚地认识HttpMessageHandler处理管道。在《利用IHttpClientFactory工厂来创建HttpClient》之后,我们将关注点放到HttpClient对象上。我们知道ASP.NET的核心就是由中间件组成的请求处理管道,HttpClient也采用了类似的设计。HttpClient管道由一组HttpMessageHandler对象构成,这些HttpMessageHandler相当于ASPNET的中间件。如下这些示例演示帮助我们更清楚地认识HttpMessageHandler处理管道。(本篇提供的实例已经汇总到《ASP.NET Core 6框架揭秘-实例演示版》)
[S1208]HttpClient的默认管道结构[S1208]HttpClient的默认管道结构(源代码)
[S1209]定制HttpClient管道(源代码)
[S1210]针对HTTP调用的日志输出(>=Information)(源代码)
[S1211]针对HTTP调用的日志输出(>=Trace)(源代码)
接下来我们通过如下的演示程序使用IHttpClientFactory工厂创建了 一个HttpClient对象,并查看其管道依次由哪些类型的HttpMessageHandler对象组成。如代码片段所示,我们定义了一个辅助方法PrintPipeline方法以递归的形式将指定HttpMessageHandler对象及其下一个处理器的类型输出到控制台上。
using Microsoft.Extensions.DependencyInjection; using System.Reflection; var www.baidu.com”发送了一个GET请求。
using App; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; var services = new ServiceCollection().AddLogging(logging => logging .AddConsole() .AddSimpleConsole(options => options.IncludeScopes = true)); services.AddHttpClient(string.Empty).AddHttpMessageHandler(() => new DelayHttpMessageHanadler()); var www.baidu.com");
程序运行之后,我们会在控制台上看到如图3所示的四条日志。日志第一条和最后一条是LoggingScopeHttpMessageHandler输出的,它创建了一个日志范围,范围名称采用模板为“HTTP {Method} {URL}”,最后一条日志会输出针对整个管道上的调用耗时。第2条和第3条日志是LoggingHttpMessageHandler对象输出的,它们写入的时机分别是发送请求前和接收到请求后,最后一条还是输出两者之间的时间间隔,也就是面向网络传输的耗时。从输出的内容可以看出,两个耗时基本上相差三秒,刚好是我们注册的DelayHttpMessageHanadler对象模拟延时。
图3 诊断日志(Level >=Information)
由于在默认情况下只有等级不低于Information的日志才会输出到控制台上,所以看不到上述两个输出的更低等级(Trace)的日志。接下来我们对程序作如下的改动,通过添加日志过滤器输出所有等级的日志。
using App; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; var services = new ServiceCollection().AddLogging(logging => logging .SetMinimumLevel(LogLevel.Trace) .AddConsole() .AddSimpleConsole(options => options.IncludeScopes = true)); services.AddHttpClient(string.Empty).AddHttpMessageHandler(() => new DelayHttpMessageHanadler()); var www.baidu.com");
再次运行我们的演示程序,控制台上将会输出如图4所示的日志。我们可以看出LoggingScopeHttpMessageHandler和LoggingHttpMessageHandler会将请求和响应的报头写入到等级为Trace的日志之中。
图4 诊断日志(All)

![ASP.NET Core 6 HttpClient管道处理实例详解[18]有哪些关键揭秘?](/imgrand/VAEEMt98.webp)