You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor Hybrid .NET MAUI中HttpClient的正确使用及问题排查

Blazor Hybrid + .NET MAUI中HttpClient的使用问题

背景

我正在使用Blazor Hybrid结合.NET MAUI,通过REST Web API获取数据。项目中使用UserService这类服务调用API,该服务依赖基类ServiceBase实现核心逻辑。

当前实现代码

目前我在ServiceBase类的属性中使用new()关键字实例化HttpClient,相关代码如下:

public class UserService : ServiceBase, IUserService
{
    public UserService(ILogger<UserService> l, HttpClient c)
        : base(l, c)
    { }

    protected readonly HttpClient _httpClient = new();
    protected readonly ILogger _logger;

    public ServiceBase(ILogger logger, HttpClient client)
    {
        _httpClient = client;
        _logger = logger;
    }

    protected async Task<Result<T>> GetFromJson<T>(string url)
    {
        try
        {
            var result = await _httpClient.GetFromJsonAsync<T>(url);
            return result;
        }
        catch (Exception e)
        {
            _logger.LogError(e, e.GetResultMessageFromError());
            return Result.Error(e.GetResultMessageFromError());
        }
    }
}

该服务在DI容器中注册为作用域服务:

builder.Services.AddScoped<IUserService, UserService>();

我知道通常使用HttpClient时,应该采用类型化客户端配置以确保资源正确释放,但某Blazor Hybrid课程建议直接用new()关键字(不清楚原因),当前这种方式运行正常。

我的问题

  1. 使用HttpClient的最佳方式是什么?如何避免误用HttpClient带来的常见问题?
  2. 在此场景下使用new()为何不会引发这些常见问题?

类型化客户端尝试及问题

我尝试改用类型化客户端的方式,但HttpClient始终无法正确实例化,相关配置及代码如下:

MAUIProgram.cs中的配置

builder.Services.AddHttpClient<UserServiceHttpTestTyped>((serviceProvider, client) =>
  {
      client.DefaultRequestHeaders.Add("Accept", "application/json");
      client.DefaultRequestHeaders.Add("x-test-header", "user Service factory");
      client.BaseAddress = new Uri("https://localhost:7263/");
  });

服务注册

builder.Services.AddTransient<IUserService, UserServiceHttpTestTyped>();

对应的服务类代码

public class UserServiceHttpTestTyped : IUserService
{
     private readonly ILogger _logger;
     private readonly HttpClient _client;

     public UserServiceHttpTestTyped(ILogger<UserService> l, HttpClient c)
     { 
         _logger = l;
         _client = c ?? throw new ArgumentNullException(nameof(UserServiceHttpTestTyped));
     }

     [Authorize(Policy = CustomPolicy.CanRead_Users)]
     public async Task<Result<User>> GetUser(Guid id)
     {
         _logger.LogDebug("Get the user with if '{id}'", id);

         var u = Api.Url(Api.GetUserById, id.ToString());

         return await _client.GetFromJsonAsync<User>(u);
     }
}

使用时的客户端状态

在服务中使用HttpClient获取数据的状态


内容的提问来源于stack exchange,提问作者tpe_001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:35:21