如何使用IHttpClientFactory在Blazor Server中配置HttpClient基础地址

12

我试图在使用IHttpClientFactory配置Blazor服务器中的HttpClient基础地址,但是我遇到了运行时异常:

    services.AddHttpClient("ApiClient", (provider, client) =>
    {
        var uriHelper = provider.GetRequiredService<NavigationManager>();
        client.BaseAddress = new Uri(uriHelper.BaseUri);
    });
System.InvalidOperationException: 'Cannot resolve scoped service 'Microsoft.AspNetCore.Components.NavigationManager' from root provider.'

异常截图

有人知道这里可能出了什么问题吗?


NavigationManager 是否已在 DI 容器中注册? - Nkosi
1
我认为运行时确保 NavigationManager 存在于 DI 中。对于 Blazor Wasm,builder.Services.AddHttpClient("ApiClient", client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)); 就可以正常工作。 - Mihaimyh
这在3.x版本中应该能正常工作。你是在使用5.x版本吗? - enet
@Mihaimyh 我认为我们需要看到更多你的代码。我将你的代码复制到一个新的 .net5.x 项目中,它像 enet 建议的那样可以正常工作。其中 NavigationManager 已提供。 - Brian Parker
现在我可以看到错误了,当我尝试创建httpClient实例时。clientFactory.CreateClient("ApiClient").BaseAddress - Brian Parker
显示剩余2条评论
3个回答

22

ConfigureServices期间,基本URL不可用,您可以传递它或创建一个服务:

services.AddHttpClient();
services.AddTransient<ApiService>();

该服务:

public class ApiService
{
    public ApiService(HttpClient httpClient, NavigationManager navigationManager)
    {
        HttpClient = httpClient;
        NavigationManager = navigationManager;
        HttpClient.BaseAddress = new Uri(NavigationManager.BaseUri);
    }

    public HttpClient HttpClient { get; }
    public NavigationManager NavigationManager { get; }
}

一个组件:

   Base Address : @ApiService.HttpClient.BaseAddress
        
    @code {
        [Inject]
        public ApiService ApiService { get; set; }   
        
    }

这对我来说是解决方案。特别是你在这里设置BaseAddress的方式是我所需要的。感谢您的发布! - hardba11
这里如何配置基地址? - Pawel
@Pawel 这是你如何从 AppSettings.json 中加载它的方式:https://dev59.com/SnENtIcB2Jgan1zn83ty#71402859 - Brian Parker
显示剩余3条评论

1

很棒的回答,约翰。这是相同的解决方案,但更简单:

services.AddScoped(sp => new HttpClient 
    { 
        BaseAddress = new Uri("https://localhost:7110/") 
    });

0

将此添加到服务中:

    var baseAddress = "http://address-goes-here/";
    services.AddScoped(sp =>
    {
        var client = new HttpClient();
        client.BaseAddress = new Uri(baseAddress);
        return client;
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接