Контекст Polly Relicense пуст.C#

Место общения программистов C#
Ответить
Anonymous
 Контекст Polly Relicense пуст.

Сообщение Anonymous »

Я реализую устойчивость для своего .NET Core Web Api, и мне нужен способ передать значение с помощью ResilienceContext, но во время отладки args.Context.Properties всегда пусто. Я не знаю, чего мне не хватает.
Я использую Microsoft.Extensions.Http.Resilience, который использует Polly
Вот код, который у меня есть:
public static class ResilienceKeys
{
public static readonly ResiliencePropertyKey LocationId = new("location-id");
}

// WordPressService.cs

public class WordPressService : IWordPressService
{
private readonly HttpClient _httpClient;
private readonly ResiliencePipelineProvider _pipelineProvider;

public WordPressService(HttpClient httpClient, ResiliencePipelineProvider pipelineProvider)
{
_httpClient = httpClient;
_httpClient.BaseAddress = new Uri("https://api.example.com/");

_pipelineProvider = pipelineProvider;
}

public async Task GetBannersByLocationAsync(int locationId, CancellationToken cancellationToken)
{
var pipeline = _pipelineProvider.GetPipeline("my-pipeline");

var context = ResilienceContextPool.Shared.Get(cancellationToken);

context.Properties.Set(ResilienceKeys.LocationId, locationId.ToString());

var response = await pipeline.ExecuteAsync(
async (context, cancellationToken) =>
{
// Simulate an error for testing purposes
await Task.Delay(100, cancellationToken);
var response = new HttpResponseMessage(HttpStatusCode.InternalServerError);
return response;
},
context,
cancellationToken);

return await response.Content.ReadAsStringAsync(cancellationToken);
}
}


Кроме того, я использую внедрение зависимостей для добавления ResiliencePipeline с RetryStrategy и FallbackStrategy для получения контента из базы данных в случае, если сервер WordPress не отвечает
// Program.cs

builder.Services.AddResiliencePipeline("my-pipeline", (pipelineBuilder, context) =>
{
var predicateBuilder = new PredicateBuilder()
.Handle()
.HandleResult(r => r.StatusCode >= HttpStatusCode.InternalServerError);

pipelineBuilder
.AddFallback(new FallbackStrategyOptions()
{
ShouldHandle = predicateBuilder,
FallbackAction = async (args) =>
{
if (args.Context.Properties.TryGetValue(ResilienceKeys.LocationId, out var data))
{
Console.WriteLine("FallbackAction, Location Id: {0}", data);
}

var fallbackResponse = new HttpResponseMessage()
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent("Fallback content")
};

return Outcome.FromResult(fallbackResponse);
}
})
.AddRetry(new RetryStrategyOptions()
{
ShouldHandle = predicateBuilder,
Delay = TimeSpan.FromSeconds(2),
MaxRetryAttempts = 2,
BackoffType = DelayBackoffType.Exponential,
UseJitter = true,
});
});


Подробнее здесь: https://stackoverflow.com/questions/792 ... t-is-empty
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»