您好,所以我尝试使用 httpclient 添加我的 api 作为依赖项注入,并更改 program.cs 文件中的基地址,这里是将其添加到容器的代码。我找到了与此相关的其他帖子并关注了他们,但没有一个起作用,并且想知道我是否在这里做了完全错误的事情。尝试了解注射的工作原理。谢谢你。
builder.Services.AddHttpClient("ProductApi", client =>
{
client.BaseAddress = new Uri("https://localhost:7023/api/");
});
这是 blazor 组件内部的代码
private async Task GetProduct()
{
// ProductApi.BaseAddress = new Uri ("https://localhost:7023/api/");
HttpResponseMessage response = await ProductApi.GetAsync("Product");
if (response.IsSuccessStatusCode)
{
var responseData = await response.Content.ReadFromJsonAsync<List<ProductModel>>();
products = responseData;
}
}
我尝试查找有关此问题的视频和其他帖子。没有一个对我有用,我也在顶部的 blazor 代码中 @inject HttpClient ProductApi
是的,你做错了什么。要使用 HTTP 客户端,您可以使用“类型化客户端”或“命名客户端”。您在这里使用命名客户端,因为您使用字符串 ProductApi
注册客户端,但您似乎想像使用类型客户端一样使用它。
使用命名客户端时,您必须注入
IHttpClientFactory
,并且每当您需要 HttpClient
调用
_httpClientFactory.CreateClient("ProductApi")
时,它都会为您提供使用 HttpClient
配置的客户端实例(类型为 AddHttpClient("ProductApi", ...)
)。这是 Microsoft 提供的示例:public class NamedClientModel : PageModel
{
private readonly IHttpClientFactory _httpClientFactory;
public NamedClientModel(IHttpClientFactory httpClientFactory) =>
_httpClientFactory = httpClientFactory;
public IEnumerable<GitHubBranch>? GitHubBranches { get; set; }
public async Task OnGet()
{
var httpClient = _httpClientFactory.CreateClient("GitHub");
var httpResponseMessage = await httpClient.GetAsync(
"repos/dotnet/AspNetCore.Docs/branches");
if (httpResponseMessage.IsSuccessStatusCode)
{
using var contentStream =
await httpResponseMessage.Content.ReadAsStreamAsync();
GitHubBranches = await JsonSerializer.DeserializeAsync
<IEnumerable<GitHubBranch>>(contentStream);
}
}
}
有关示例的原始来源和更详细的说明,请参阅
Microsoft Docs - 在 ASP.NET Core 中使用 IHttpClientFactory 发出 HTTP 请求。