.NET注册HTTP客户端:添加处理程序的顺序是否重要?顺序错误会有问题吗?
.NET HTTP客户端消息处理程序的添加顺序问题
添加处理程序的顺序非常重要。HTTP客户端的消息处理程序是按管道模式工作的:发送请求时,会从你最后添加的处理程序开始,往前依次执行;收到响应时,则反过来从第一个添加的处理程序开始,往后依次执行。
把
AddPolicyHandlerFromRegistry放在AddOAuthHttpMessageHandler之前确实会引发问题,原因如下:AddOAuthHttpMessageHandler的作用是给请求添加OAuth令牌,属于请求发送前的预处理逻辑;而AddPolicyHandlerFromRegistry一般用来配置重试、熔断、超时这类策略。- 如果策略处理程序在前,那么重试策略会把令牌获取的逻辑也包含进去。要是身份服务临时限流或者令牌获取失败,重试机制会重复触发令牌请求,既浪费资源,还可能触发身份服务的限流阈值。
正确的做法是把OAuth处理程序放在策略处理程序前面,这样策略只会作用于实际的业务请求,不会重复执行令牌获取逻辑,调整后的代码如下:
return services .Configure<Options>(configuration.GetSection(nameof(Options))) .AddHttpClient<IService, Service>() .AddOAuthHttpMessageHandler(() => configuration.GetBinded<Options>().RealmScope) .AddPolicyHandlerFromRegistry("Field") .AddHttpMessageHandler<TrackingHandler>() .Services;
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

