[英]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”等,這不是唯一的方法。
您可以使用對象瀏覽器找出庫提供給您的名稱空間和類:
單擊“PollyHttpClientBuilderExtensions”顯示該類提供的方法:
而且,顧名思義,下方窗格中顯示的方法簽名表明所選方法是IHttpClientBuilder
上的擴展方法,因此您必須將其與services.AddHttpClient()
結合使用。 這似乎是您想要在代碼中訪問的那個。 因此,您應該using
以下內容包括:
using Microsoft.Extensions.DependencyInjection;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.