Asp ядро: IHostedService и IHttpClientFactory - лучший способ? - PullRequest
0 голосов
/ 21 июня 2020

У меня asp основное приложение. Я использую IHostedService для задачи periodi c. Мне нужно отправить периодi c 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(); 

Это работает. Но я не уверен, что это лучшее решение для производительности. Есть советы?

1 Ответ

1 голос
/ 23 июня 2020

Я новичок в ядре asp. Это пример, который я нашел на net. как мне это сделать правильно?

Если вы хотите запустить фоновую службу для отправки запроса в ядро ​​asp. net, я предлагаю вам напрямую ввести 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;
    }
 }

Результат:

enter image description here

More details about how to use asp.net core background service, you could refer to this артикул .

...