调用GetPrivateHttpClient时出现GetFromJsonAsync不存在的C#错误
我创建了一个C#类库,其中包含GetHttpClient.cs类。使用GetPublicHttpClient()方法时无报错,但调用GetPrivateHttpClient()时出现错误:
“Task
不包含GetFromJsonAsync的定义,最佳扩展方法重载HttpClientJsonExtensions.GetFromJsonAsync<WeatherForecast[]>(HttpClient, string?, CancellationToken)需要System.Net.Http.HttpClient类型的接收者”
已安装Microsoft.Extensions.Http 8.0.0等所需包,附上相关代码,查阅文档后仍无法解决问题。
GetHttpClient.cs代码
using BaseLibrary.DTOs; namespace ClientLibrary.Helpers { public class GetHttpClient(IHttpClientFactory httpClientFactory, LocalStorageService localStorageService) { private const string HeaderKey = "Authorization"; public async Task<HttpClient> GetPrivateHttpClient() { var client = httpClientFactory.CreateClient("SystemApiClient"); var stringToken = await localStorageService.GetToken(); if (string.IsNullOrEmpty(stringToken)) return client; var deserializeToken = Serializations.DeserializeJsonString<UserSession>(stringToken); if (deserializeToken == null) return client; client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", deserializeToken.Token); return client; } public HttpClient GetPublicHttpClient() { var client = httpClientFactory.CreateClient("SystemApiClient"); client.DefaultRequestHeaders.Remove(HeaderKey); return client; } } }
UserAccountService.cs代码
using System.Net.Http.Json; using BaseLibrary.DTOs; using BaseLibrary.Responses; using ClientLibrary.Helpers; using ClientLibrary.Services.Contracts; namespace ClientLibrary.Services.Implementations { public class UserAccountService(GetHttpClient getHttpClient) : IUserAccountService { public const string AuthUrl = "api/authentication"; public async Task<GeneralResponse> CreateAsync(Register user) { var httpClient = getHttpClient.GetPublicHttpClient(); var result = await httpClient.PostAsJsonAsync($"{AuthUrl}/register", user); if (!result.IsSuccessStatusCode) return new GeneralResponse(false, "Error occurred"); return await result.Content.ReadFromJsonAsync<GeneralResponse>()!; } public async Task<LoginResponse> SignInAsync(Login user) { var httpClient = getHttpClient.GetPublicHttpClient(); var result = await httpClient.PostAsJsonAsync($"{AuthUrl}/login", user); if (!result.IsSuccessStatusCode) return new LoginResponse(false, "Error occurred"); return await result.Content.ReadFromJsonAsync<LoginResponse>()!; } public Task<LoginResponse> RefreshTokenAsync(RefreshToken token) { throw new NotImplementedException(); } public async Task<WeatherForecast[]> GetWeatherForecast() { var httpClient = getHttpClient.GetPrivateHttpClient(); var result = await httpClient.GetFromJsonAsync<WeatherForecast[]>("api/weatherforecast"); return result!; } } }
问题根源是GetPrivateHttpClient()是异步方法,返回的是Task
修改UserAccountService.cs中的GetWeatherForecast方法,给GetPrivateHttpClient()调用添加await:
public async Task<WeatherForecast[]> GetWeatherForecast() { var httpClient = await getHttpClient.GetPrivateHttpClient(); // 新增await关键字 var result = await httpClient.GetFromJsonAsync<WeatherForecast[]>("api/weatherforecast"); return result!; }
补充说明:GetPublicHttpClient是同步方法,直接返回HttpClient实例,所以之前调用时无需await也能正常使用;而GetPrivateHttpClient因为需要异步获取token,所以设计为异步方法,必须通过await才能拿到内部的HttpClient对象。
内容的提问来源于stack exchange,提问作者Ramin Emami

