基于从中间件接收到的 http 标头的 Http 客户端注册

问题描述

我遇到以下情况:我正在使用 web api core 3.1 框架 (c#)

我正在使用在启动中注册的类型化 httpclient。在启动时注册类型化客户端时,我无法提供基本 URL 和凭据,因为我正在通过一个名为 configread 的服务,它从标头读取数据,只有当我们的一个中间件运行和设置时才可用

在我的情况下,基地址、用户 ID 和密码来自服务调用,但服务调用取决于请求标头(httpContext 对象)。在 configureService 方法中,请求上下文不可用。

现在我无法从启动中获取 httpClient。

任何指导将不胜感激。

更新 1:

我正在添加如下类型的客户端

service.AddHttpClient<IAgencyServiceAgent,AgencyServiceAgent> (GetAgencyAgentHttpClient()).
ConfigurePrimaryHttpMessageHandler(GetAgencyHttpMessageHandler()) private Action<HttpClient> GetAgencyAgentHttpClient () 
{ 
var configUrl = Environment.GetEnvironmentVariable(ConfigConstants.CONFIGSERVICE URL) 
return httpClient => { 
// Here the base address is availble thru another service // which accept the data from the httpContext and based on the values / It pulls the base address and request header etc... 
} 
}

更新 2:

我在启动时设置这个 httpclient 有困难,因为 baseUrl 和其他信息取决于请求对象。例如:我正在读取一个名为 DEV1 的请求标头并将其传递给另一个服务,然后它会返回我所需的基地址和凭据,然后在我可以设置 http 客户端之后我的问题是如何去做。当 httpClient 配置依赖于 httpContext 对象.. 那么我们应该如何注册和使用它谢谢

解决方法

根据您的描述,我建议您可以尝试在您的 GetAgencyAgentHttpClient 方法中构建 ServiceProvider 并使用 GetService 方法来获取您要使用的服务。

更多细节,您可以参考以下代码:

        services.AddHttpClient("hello",c =>
        {
            //Build service provider
            ServiceProvider serviceProvider = services.BuildServiceProvider();
            //Get the ICurrentUserService
            var currentUserService = serviceProvider.GetService<ICurrentUserService>();
            //Use ICurrentUserService GetIPaddress method
            var re=  currentUserService.GetIPaddress();
            c.BaseAddress = new Uri("http://localhost:5000");
        }).AddTypedClient(c => Refit.RestService.For<IHelloClient>(c)); ;

结果:

enter image description here


如果您想检查从当前 httprequest 中获取 http 标头,您可以尝试获取服务中的 httpcontext 访问器。

更多细节,您可以参考以下代码:

        services.AddHttpClient("hello",c =>
        {
            ServiceProvider serviceProvider = services.BuildServiceProvider();
            //var currentUserService = serviceProvider.GetService<ICurrentUserService>();
            //var re=  currentUserService.GetIPaddress();
            var httpcontext = serviceProvider.GetService<IHttpContextAccessor>();
             var re = httpcontext.HttpContext.Request.Headers.ToList();

            c.BaseAddress = new Uri("http://localhost:5000");
        }).AddTypedClient(c => Refit.RestService.For<IHelloClient>(c)); 

结果:

enter image description here

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...