如何用JwtBearer令牌重复调用REST API?解决Build()后配置修改报错
.NET Core守护进程动态调用API问题解决
核心问题说明
调用tokenAcquirerFactory.Build()后,服务容器已完成初始化,无法再修改服务或全局配置,这是依赖注入容器的设计特性。另外GetForAppAsync是Microsoft.Identity.Web库中IDownstreamApi的扩展方法,因属于特定场景的API,搜索结果较少是正常现象。
解决方案:单次Build后动态调整API请求参数
不需要修改TokenAcquirerFactory的全局配置,只需在每次API调用时动态传递请求参数即可,具体有两种实现方式:
方式1:用DownstreamApiOptions覆盖参数
注册下游API时仅配置基础信息(如BaseUrl、默认Scope),后续调用时通过DownstreamApiOptions动态设置相对路径、查询参数:
// 仅初始化一次服务容器 var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance(); tokenAcquirerFactory.Services.AddLogging(builder => builder.SetMinimumLevel(LogLevel.Warning).AddConsole()); // 注册下游API基础配置 tokenAcquirerFactory.Services.AddDownstreamApi( "MyApi", tokenAcquirerFactory.Configuration.GetSection("MyWebApi")); var sp = tokenAcquirerFactory.Build(); var api = sp.GetRequiredService<IDownstreamApi>(); // 第一次调用:携带查询参数param1=value1 var options1 = new DownstreamApiOptions { RelativePath = "/api/todoitems", QueryParameters = new Dictionary<string, string> { { "param1", "value1" } } }; var result1 = await api.GetForAppAsync<IEnumerable<TodoItem>>("MyApi", options1); // 第二次调用:修改查询参数,新增param2 var options2 = new DownstreamApiOptions { RelativePath = "/api/todoitems", QueryParameters = new Dictionary<string, string> { { "param1", "value2" }, { "param2", "test" } } }; var result2 = await api.GetForAppAsync<IEnumerable<TodoItem>>("MyApi", options2);
方式2:直接构造完整请求URI
如果需要更高灵活性,可以直接传入完整URI,忽略配置中的相对路径:
var baseUrl = tokenAcquirerFactory.Configuration["MyWebApi:BaseUrl"]; // 第一次调用的完整URI var fullUri1 = $"{baseUrl}/api/todoitems?param1=value1"; var result1 = await api.GetForAppAsync<IEnumerable<TodoItem>>( "MyApi", new DownstreamApiOptions { FullUri = fullUri1 }); // 第二次调用修改参数 var fullUri2 = $"{baseUrl}/api/todoitems?param1=value2&page=2"; var result2 = await api.GetForAppAsync<IEnumerable<TodoItem>>( "MyApi", new DownstreamApiOptions { FullUri = fullUri2 });
注意要点
- 全局服务容器仅需初始化一次,后续所有API调用复用同一个
IDownstreamApi实例即可。 - 确保项目已正确引用
Microsoft.Identity.WebNuGet包,GetForAppAsync属于该包下的扩展方法。 - 若需动态修改认证Scope,也可在
DownstreamApiOptions中设置Scopes属性,覆盖全局配置的Scope值。
内容的提问来源于stack exchange,提问作者StinkySocks
相关产品推荐
相关产品推荐

