【问题标题】:Asp core: IHostedService and IHttpClientFactory - best way?Asp 核心:IHostedService 和 IHttpClientFactory - 最好的方法?
【发布时间】:2020-10-11 09:49:37
【问题描述】:

我有 asp 核心应用程序。我将 IHostedService 用于定期任务。我需要定期发送 http 请求。这是我的代码:

  class MyService: IHostedService 
  {
    
    private readonly IServiceScopeFactory _scopeFactory;

    public MyService(IServiceScopeFactory scopeFactory)
    {
        _scopeFactory = scopeFactory;
    }        

    private async void DoWork(object state)
    {
        using (var scope = _scopeFactory.CreateScope())
        {
            var clientFactory = scope.ServiceProvider.GetRequiredService<IHttpClientFactory>();
            var request = new HttpRequestMessage(HttpMethod.Get,
                "https://api.github.com/repos/aspnet/AspNetCore.Docs/branches");
            request.Headers.Add("Accept", "application/vnd.github.v3+json");
            request.Headers.Add("User-Agent", "HttpClientFactory-Sample");

            var client = clientFactory.CreateClient();
            var response = await client.SendAsync(request);
            ...
            
        }
    }
  }
 

我还在我的 Startup.cs 中添加了它

services.AddHttpClient(); 

这是有效的。但我不确定这是否是最佳性能解决方案。有什么建议吗?

【问题讨论】:

  • 据我所知,services.AddHttpClient会将服务注册为Singleton而不是作用域,也就是说不需要将服务创建为作用域,我们可以直接在DoWork中使用.您能告诉我为什么将服务注册为范围吗?此外,您似乎只是在应用程序启动时调用了一次后台服务。请告诉我您将在后台服务中发送多少个请求。
  • 我是 asp 核心的新手。这是我在网上找到的一个例子。我该怎么做?
  • 在我看来,没有必要再使用scope.ServiceProvider.GetRequiredService注入IHttpClientFactory,你可以使用下面的例子来达到你的要求。

标签: asp.net-core .net-core asp.net-core-mvc asp.net-core-webapi


【解决方案1】:

我是 asp 核心的新手。这是我在网上找到的一个例子。我该怎么做?

如果你想在asp.net core中运行后台服务发送请求,我建议你可以直接注入httpClientFactory而不是使用ServiceProvider.GetRequiredService再次注入。

更多细节,您可以参考以下代码:

  1. 确保您已将 AddHttpClient 服务添加到 startup.cs 中

    services.AddHttpClient();

2.在worker.cs中添加以下代码:

public class Worker : IHostedService
{
    private IHttpClientFactory httpClientFactory;

    public Worker(IHttpClientFactory _httpClientFactory) {

        httpClientFactory = _httpClientFactory;

    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
         DoWork("test");
        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        return Task.CompletedTask;
    
    }

    private async void DoWork(object state)
    {

        var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:9012/");
        //request.Headers.Add("Accept", "application/vnd.github.v3+json");
        //request.Headers.Add("User-Agent", "HttpClientFactory-Sample");
        var client = httpClientFactory.CreateClient();
        var response = await client.SendAsync(request);

        int i = 0;
    }
 }

结果:

更多asp.net core后台服务的使用方法,可以参考article

【讨论】:

    猜你喜欢
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多