Blazor服务器端的AddHttpClient

时间:2019-11-30 20:53:50

标签: core blazor-server-side

我正在尝试在Blazor服务器端创建一个httpclient,这将在每次调用webapi时产生最少的配置工作量。

基本上我想实现以下目标:

  1. 命名为HTTPClient,当我在webapi中调用函数时可以自动调用。
  2. webapi需要一个承载令牌,我可以通过调用AcquireTokenSilent来获取
  3. 如果我在调用api时不必指定httpclient,那就太好了
  4. 已将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,该类型可以自动注入。

我需要帮助的部分:

  1. 鉴于我已将我的httpclient指定为特定类型,如果我在webapi中调用一个函数,它将自动调用吗? (似乎在调试时不会触发)
  2. 要获取承载令牌,我需要获取当前的用户ID,该用户ID在authstateprovider中...看到它在启动中,甚至可以从DI获取它吗?
  3. 有什么简单的方法可以将httpclient注入我的webapi类的构造函数中?我能否在构造函数中获取httpclient,这样我基本上就拥有了一个不要求httpclient的无参数构造函数?

1 个答案:

答案 0 :(得分:0)

关于第一个问题,在您的视图中插入Web API HttpClient:

@inject myapp.server.api.swaggerClient MyClient 

,然后在代码块中:

currentCount = MyClient.WeatherForecastAsync().Result.FirstOrDefault().Summary;

您应该能够调试AddHttpClient内部的代码。