如何在 Blazor WebAssembly 中使用不同的配置配置多个 HttpClient 实例

bob*_*b82 7 c# asp.net-core blazor-client-side

我正在尝试在 Blazor WASM 的 Program.cs 类中配置多个 API url。我没有看到像服务器端那样的 AddHttpClient 扩展。想知道是否有人对此有替代解决方案?

这是我到目前为止所拥有的:

var firstURI = new Uri("https://localhost:44340/");
var secondURI = new Uri("https://localhost:5001/");

void RegisterTypedClient<TClient, TImplementation>(Uri apiBaseUrl)
   where TClient : class where TImplementation : class, TClient
{
   builder.Services.AddHttpClient<TClient, TImplementation>(client =>
   {
       client.BaseAddress = apiBaseUrl;
   });
}

// HTTP services
RegisterTypedClient<IFirstService, FirstService>(firstURI);
RegisterTypedClient<ISecondService, SecondService>(secondURI);
Run Code Online (Sandbox Code Playgroud)

小智 16

这可以通过 Blazor 客户端完成。首先,在您的客户端包中,获取以下 nuget 包:Microsoft.Extensions.Http

然后,为这个例子创建两个类(通常你会使用一个接口,但一个类本身应该在这里工作。我将演示使用的两个不同的基地址,所以你知道有区别。

   public class GoogleService
    {
        private readonly HttpClient httpClient;

        public GoogleService(HttpClient httpClient)
        {
            this.httpClient = httpClient;
        }

        public string GetBaseUrl()
        {
            return httpClient.BaseAddress.ToString();
        }
    }
Run Code Online (Sandbox Code Playgroud)

和雅虎服务:

  public class YahooService
    {
        private readonly HttpClient httpClient;

        public YahooService(HttpClient httpClient)
        {
            this.httpClient = httpClient;
        }

        public string GetBaseUrl()
        {
            return httpClient.BaseAddress.ToString();
        }
    }
Run Code Online (Sandbox Code Playgroud)

接下来,在您的客户端程序的 Program.cs 中,您可以执行以下操作:

public static async Task Main(string[] args)
        {
            var builder = WebAssemblyHostBuilder.CreateDefault(args);
            builder.RootComponents.Add<App>("app");

            builder.Services.AddHttpClient<GoogleService>(client =>
            {
                client.BaseAddress = new Uri("https://google.com/");
            });

            builder.Services.AddHttpClient<YahooService>(client =>
            {
                client.BaseAddress = new Uri("https://yahoo.com/");
            });

            await builder.Build().RunAsync();
        }
Run Code Online (Sandbox Code Playgroud)

接下来,您可以像这样将它们注入前端,并看到它们确实是两个不同的注入客户端:

@page "/"
@inject BlazorHttpClientTest.Client.Clients.GoogleService googleService;
@inject BlazorHttpClientTest.Client.Clients.YahooService yahooService;

<h1>Hello, world!</h1>

<label>Google Address:</label><label>@googleAddress</label>
<label>Yahoo Address:</label><label>@yahooAddress</label>

@code{
    string googleAddress;
    string yahooAddress;

    protected override void OnInitialized()
    {
        base.OnInitialized();

        googleAddress = googleService.GetBaseUrl();
        yahooAddress = yahooService.GetBaseUrl();

    }
}
Run Code Online (Sandbox Code Playgroud)

就像那样,你应该让它工作:

在此处输入图片说明

如果您需要我更深入地解释任何其他内容,请告诉我,否则,如果对您有用,请标记为已回答。