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()关键字(不清楚原因),当前这种方式运行正常。
我的问题
- 使用
HttpClient的最佳方式是什么?如何避免误用HttpClient带来的常见问题? - 在此场景下使用
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); } }
使用时的客户端状态

内容的提问来源于stack exchange,提问作者tpe_001
相关产品推荐
相关产品推荐

