【发布时间】:2020-03-25 23:01:51
【问题描述】:
我正在尝试在 Blazor 服务器端创建一个 httpclient,这将在我每次调用我的 webapi 时创建最少的配置工作。
基本上我想实现以下目标:
- 当我在我的 webapi 中调用一个函数时,我可以自动调用命名为 HTTPClient。
- webapi 需要一个不记名令牌,我通过调用 AcquireTokenSilent 获得该令牌
- 如果我在调用 api 时不必指定 httpclient,那就太好了
- webapi 已添加为服务引用,因此在命名空间 myapp.server.api 下创建了脚手架类
为此,我在启动时创建了以下内容:
services.AddHttpClient<myapp.server.api.swaggerClient>(c =>
{
c.BaseAddress = new Uri("https://api.myapp.com/");
AzureADB2COptions opt = new AzureADB2COptions();
Configuration.Bind("AzureAdB2C", opt);
IConfidentialClientApplication cca =
ConfidentialClientApplicationBuilder.Create(opt.ClientId)
.WithRedirectUri(opt.RedirectUri)
.WithClientSecret(opt.ClientSecret)
.WithB2CAuthority(opt.Authority)
.WithClientName("myWebapp")
.WithClientVersion("0.0.0.1")
.Build();
IHttpContextAccessor pp;
string signedInUserID = context.User.FindFirst(ClaimTypes.NameIdentifier).Value;
new MSALStaticCache(signedInUserID, pp.HttpContext).EnablePersistence(cca.UserTokenCache);
var accounts = cca.GetAccountsAsync().Result;
AuthenticationResult result = null;
result = cca.AcquireTokenSilent(opt.ApiScopes.Split(' '), accounts.FirstOrDefault()).ExecuteAsync().Result;
c.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", result.AccessToken);
});
我希望能够以这种方式在我的视图中调用我的api:
myapp.server.api.swaggerClient t = new myapp.server.api.swaggerClient();
currentCount = t.WeatherForecastAsync().Result.FirstOrDefault().Summary;
调用 swaggerclient 的新实例需要我指定一个 httpclient,所以我希望在全局级别注入我正在配置的 httpclient,以便可以自动注入该类型。
我需要帮助的部分:
- 鉴于我已将我的 httpclient 范围指定为特定类型,如果我在 webapi 中调用函数,它会自动调用吗? (调试时似乎不会触发)
- 要获取不记名令牌,我需要获取当前用户 ID,它位于 authstateprovider 中...看到这是在 Startup 中,是否可以从 DI 获取它?
- 有什么简单的方法可以在我的 webapi 类的构造函数中注入 httpclient?我是否能够在构造函数中获取 httpclient,以便我本质上拥有一个不要求 httpclient 的无参数构造函数?
【问题讨论】: