【问题标题】:AddHttpClient in Blazor Server SideBlazor 服务器端中的 AddHttpClient
【发布时间】:2020-03-25 23:01:51
【问题描述】:

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

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

  1. 当我在我的 webapi 中调用一个函数时,我可以自动调用命名为 HTTPClient。
  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,它位于 authstateprovider 中...看到这是在 Startup 中,是否可以从 DI 获取它?
  3. 有什么简单的方法可以在我的 webapi 类的构造函数中注入 httpclient?我是否能够在构造函数中获取 httpclient,以便我本质上拥有一个不要求 httpclient 的无参数构造函数?

【问题讨论】:

    标签: core blazor-server-side


    【解决方案1】:

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

    @inject myapp.server.api.swaggerClient MyClient 
    

    然后在代码块中:

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

    您应该可以调试AddHttpClient 中的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-28
      • 2020-05-15
      • 1970-01-01
      • 2020-09-19
      • 2020-04-14
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多