问题描述
我遇到以下情况:我正在使用 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)); ;
结果:
如果您想检查从当前 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));
结果: