簡體   English   中英

如何在netcoreapp3.1 worker服務項目中使用Microsoft.Extensions.Http.Polly

[英]How to use Microsoft.Extensions.Http.Polly in netcoreapp3.1 worker service project

我試圖暗示以下文章: https : //github.com/App-vNext/Polly/wiki/Polly-and-HttpClientFactory

我在我的 Worker Service 項目中使用 HttpFactory 來獲取一些數據,我想使用 Microsoft.Extensions.Http.Polly 使其更加健壯。

問題是即使安裝了軟件包,我仍然收到以下錯誤:

嚴重性代碼描述項目文件行抑制狀態錯誤 CS0234 命名空間“Microsoft.Extensions.Http”中不存在類型或命名空間名稱“Polly”(您是否缺少程序集引用?)

<Project Sdk="Microsoft.NET.Sdk.Worker">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="5.0.0" />
    <PackageReference Include="Microsoft.Extensions.Http" Version="5.0.0" />
    <PackageReference Include="Microsoft.Extensions.Http.Polly" Version="5.0.0" />
    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\SolutionLibrary\SolutionLibrary.csproj" />
  </ItemGroup>
</Project>

在此處輸入圖片說明

我錯過了什么 ?

編輯

如果有人需要一個工作代碼實現示例,這里是:

//程序.cs

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.Http;
using Microsoft.Extensions.Internal;
using Polly;


namespace SyncElnetService
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddHostedService<Worker>();
                    services.AddHttpClient("Elnet")
                .AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(new[]
                {
                    TimeSpan.FromSeconds(1),
                    TimeSpan.FromSeconds(5),
                    TimeSpan.FromSeconds(10)
                }));
                });
    }
}

//工人.cs

public class Worker : BackgroundService
    {
        
        private readonly ILogger<Worker> _logger;
        private readonly IConfiguration _config;
        private readonly IHttpClientFactory _httpClientFactory;

        private DataAccess dataAccess;
        private List<Action> actionList;


        public Worker(ILogger<Worker> logger, IConfiguration configuration, IHttpClientFactory httpClientFactory)
        {
            _logger = logger;
            _config = configuration;
            _httpClientFactory = httpClientFactory;
        }

//類.cs

 public async Task<HttpResponseMessage> PostToApi(string Uri)
        {

            var httpClient = httpClientFactory.CreateClient("Elnet");
            var byteArray = new UTF8Encoding().GetBytes(UserName + ":" + Password);
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
            httpClient.Timeout = TimeSpan.FromMinutes(3);

            using (HttpResponseMessage request = new HttpResponseMessage())
            {
                request.Version = HttpVersion.Version10;
                var response = await httpClient.GetAsync(Uri);
                httpClient.Dispose();
                return request;
            }
        }

您錯過了包或程序集名稱與代碼所在的命名空間不同的名稱。盡管通常約定,名為“Foo”的包將占用命名空間“Foo”,而相關的命名空間將類似於“Foo.Bar”等,這不是唯一的方法。

您可以使用對象瀏覽器找出庫提供給您的名稱空間和類:

  1. 在 Visual Studio 中,選擇“查看”
  2. 選擇“對象瀏覽器”
  3. 您將看到您的解決方案引用的程序集列表
  4. 向下滾動到“Microsoft.Extensions.Http.Polly”並展開它

在此處輸入圖片說明

  1. 你可以看到它在 4 個命名空間中聲明了代碼:
    • Microsoft.Extensions.DependencyInjection
    • Microsoft.Extensions.Http
    • Microsoft.Extensions.Internal
    • 波莉

單擊“PollyHttpClientBuilderExtensions”顯示該類提供的方法:

在此處輸入圖片說明

而且,顧名思義,下方窗格中顯示的方法簽名表明所選方法是IHttpClientBuilder上的擴展方法,因此您必須將其與services.AddHttpClient()結合使用。 這似乎是您想要在代碼中訪問的那個。 因此,您應該using以下內容包括:

using Microsoft.Extensions.DependencyInjection;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM