Я реализую устойчивость для своего .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
Контекст Polly Resilience пуст. ⇐ C#
Место общения программистов C#
1734078227
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,
});
});
Подробнее здесь: [url]https://stackoverflow.com/questions/79276987/polly-resilience-context-is-empty[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия