如果 .RAZOR 文件中没有正常的 class 结构,我该如何将 IHttpClientFactory 与 .NET Core 5.x 和 Blazor 一起使用?
How do I use IHttpClientFactory with .NET Core 5.x and Blazor given that there is not a normal class structure in a .RAZOR file?
我想在这个 post 开头加上这样一个事实,即我是 C#、.NET Core 和 Blazor 的新手,因为我是 Java 的老手。
我正在关注 Microsoft 关于 Make HTTP requests using IHttpClientFactory in ASP.NET Core 的文档,但我似乎无法理解如何在我的应用程序中使用它。
我有一个 API 端点的 IP 地址,所以我创建了一个命名客户端:
services.AddHttpClient("TheAPIEndpoint", client =>
{
client.BaseAddress = new Uri("192.168.1.234");
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.DefaultRequestHeaders.Add("User-Agent", "Skynet v1.0");
});
接下来,我转到页面顶部文档的“基本用法”部分,它说:
可以使用依赖项注入 (DI) 请求 IHttpClientFactory。以下代码使用 IHttpClientFactory 创建一个 HttpClient 实例
它说要为我的 class 创建一个构造函数并传入一个 IHttpClientFactory:
public class BasicUsageModel : PageModel
{
private readonly IHttpClientFactory _clientFactory;
public BasicUsageModel(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
public async Task OnGet()
{
var client = _clientFactory.CreateClient();
}
}
这是我的问题“开始”的地方。当您为 Blazor 应用程序创建新的 Razor 组件时,生成的 .RAZOR 文件如下所示:
<h3>HelloWorld</h3>
@code {
}
当我需要调用API时,我需要创建这个方法:
private async Task GetSearchResults()
{
// ...
}
加在一起,看起来像这样:
<h3>HelloWorld</h3>
@if (fetchedResults != null)
{
@foreach (var result in fetchedResults)
{
<p>@(result.someData)</p>
}
}
@code {
private async Task GetSearchResults()
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(@"http://192.168.1.234:8082/");
// ...
fetchedResults = JsonConvert.DeserializeObject<ResultSet>(response);
}
}
如您所见,我没有一个“普通”class 结构来创建构造函数,向其传递一个 IHttpClientFactory
参数,我可以用它创建一个新的HttpClient.
那么,我该怎么做呢?
正如您已经发现的那样,Blazor 不支持构造函数,instead it provides the @inject
directive to support dependency injection。语法是:
@inject <dependency-type-name> <variable-name>
你的情况:
@inject IHttpClientFactory _clientFactory
<h3>HelloWorld</h3>
@if (fetchedResults != null)
{
@foreach (var result in fetchedResults)
{
<p>@(result.someData)</p>
}
}
@code {
private async Task GetSearchResults()
{
var client = _clientFactory.CreateClient();
client.BaseAddress = new Uri(@"http://192.168.1.234:8082/");
// ...
fetchedResults = JsonConvert.DeserializeObject<ResultSet>(response);
}
}
不要忘记在 Startup.ConfigureServices
方法中注册您的依赖项!
我想在这个 post 开头加上这样一个事实,即我是 C#、.NET Core 和 Blazor 的新手,因为我是 Java 的老手。
我正在关注 Microsoft 关于 Make HTTP requests using IHttpClientFactory in ASP.NET Core 的文档,但我似乎无法理解如何在我的应用程序中使用它。
我有一个 API 端点的 IP 地址,所以我创建了一个命名客户端:
services.AddHttpClient("TheAPIEndpoint", client =>
{
client.BaseAddress = new Uri("192.168.1.234");
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.DefaultRequestHeaders.Add("User-Agent", "Skynet v1.0");
});
接下来,我转到页面顶部文档的“基本用法”部分,它说:
可以使用依赖项注入 (DI) 请求 IHttpClientFactory。以下代码使用 IHttpClientFactory 创建一个 HttpClient 实例
它说要为我的 class 创建一个构造函数并传入一个 IHttpClientFactory:
public class BasicUsageModel : PageModel
{
private readonly IHttpClientFactory _clientFactory;
public BasicUsageModel(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
public async Task OnGet()
{
var client = _clientFactory.CreateClient();
}
}
这是我的问题“开始”的地方。当您为 Blazor 应用程序创建新的 Razor 组件时,生成的 .RAZOR 文件如下所示:
<h3>HelloWorld</h3>
@code {
}
当我需要调用API时,我需要创建这个方法:
private async Task GetSearchResults()
{
// ...
}
加在一起,看起来像这样:
<h3>HelloWorld</h3>
@if (fetchedResults != null)
{
@foreach (var result in fetchedResults)
{
<p>@(result.someData)</p>
}
}
@code {
private async Task GetSearchResults()
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(@"http://192.168.1.234:8082/");
// ...
fetchedResults = JsonConvert.DeserializeObject<ResultSet>(response);
}
}
如您所见,我没有一个“普通”class 结构来创建构造函数,向其传递一个 IHttpClientFactory
参数,我可以用它创建一个新的HttpClient.
那么,我该怎么做呢?
正如您已经发现的那样,Blazor 不支持构造函数,instead it provides the @inject
directive to support dependency injection。语法是:
@inject <dependency-type-name> <variable-name>
你的情况:
@inject IHttpClientFactory _clientFactory
<h3>HelloWorld</h3>
@if (fetchedResults != null)
{
@foreach (var result in fetchedResults)
{
<p>@(result.someData)</p>
}
}
@code {
private async Task GetSearchResults()
{
var client = _clientFactory.CreateClient();
client.BaseAddress = new Uri(@"http://192.168.1.234:8082/");
// ...
fetchedResults = JsonConvert.DeserializeObject<ResultSet>(response);
}
}
不要忘记在 Startup.ConfigureServices
方法中注册您的依赖项!