AddHttpClient на стороне сервера Blazor - PullRequest
0 голосов
/ 30 ноября 2019

Я пытаюсь создать httpclient на стороне Blazor Server, который бы создавал наименьшее количество усилий по настройке каждый раз, когда я вызываю мой webapi.

По сути, я хотел бы добиться следующего:

  1. Именованный HTTPClient Я могу автоматически вызывать, когда я вызываю функцию в моем webapi.
  2. Webapi требует токен на предъявителя, который я получаю, вызывая AcquireTokenSilent
  3. Было бы замечательно, если бы мне не приходилось указывать httpclient при вызове API
  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 для определенного типа, будет ли он вызывать Automatica? Если я вызову функцию в моем вебапи? (Кажется, не срабатывает при отладке)
  2. Чтобы получить токен на предъявителя, мне нужно получить текущий идентификатор пользователя, который находится в authstateprovider ... видя, что это в автозагрузке, получает его из DI дажевозможно?
  3. Есть ли простой способ добавить httpclient в конструктор моих классов webapi? смогу ли я получить httpclient в конструкторе, чтобы у меня был конструктор без параметров, не запрашивающий httpclient?

1 Ответ

0 голосов
/ 02 декабря 2019

Относительно вашего первого вопроса, введите HttpClient Web API следующим образом:

@inject myapp.server.api.swaggerClient MyClient 

, а затем в блок кода:

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

Вы должны быть в состоянии отладитькод внутри AddHttpClient.

...