Как получить доступ к прочному сущности от делегирования?C#

Место общения программистов C#
Ответить
Anonymous
 Как получить доступ к прочному сущности от делегирования?

Сообщение Anonymous »

У меня есть прочная оркестровая функций, где мне нужно оценить запросы на внешний API. В оркестраторе есть множество задач, которые вызывают функцию «Загрузить Dodata» с различными параметрами, но я не мог понять, как ограничить запросы на внешнюю службу во всем мире, для всех случаев «DownloadData».
Я подумал, что попробую использовать прочную сущность, чтобы отслеживать оставшиеся вызовы в определенные сроки. Ограничение через прочную сущность, , однако приложение вылетает, поскольку оно не может установить DurableTaskClient через DI, и я не знаю, как это исправить.

Код: Выделить всё

public class AuthenticationHandler : DelegatingHandler
{
private readonly IKeyVaultService _keyVaultService;
private readonly ILogger _logger;
private readonly DurableTaskClient _durableClient;

public AuthenticationHandler(IKeyVaultService keyVaultService, ILogger logger, DurableTaskClient durableClient)
{
_keyVaultService = keyVaultService ?? throw new ArgumentNullException(nameof(keyVaultService));
_logger = logger;
_durableClient = durableClient;
}
protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
string token = await _keyVaultService.GetAccessTokenAsync();
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);

var entityId = new EntityInstanceId(nameof(RateLimiterEntity), "RateLimiter");
EntityMetadata? entity = await _durableClient.Entities.GetEntityAsync(entityId, cancellation: cancellationToken);

_logger.LogInformation("Remaining requests: {rem}", entity.State.RemainingRequests.ToString());

if (entity != null && entity.State.RemainingRequests  TimeSpan.Zero)
{
_logger.LogWarning("Rate limit reached. Delaying for {Delay} seconds", delay.TotalSeconds);
await Task.Delay(delay, cancellationToken);
}
await _durableClient.Entities.SignalEntityAsync(entityId, nameof(RateLimiterEntity.Reset), cancellationToken);
}
await _durableClient.Entities.SignalEntityAsync(entityId, nameof(RateLimiterEntity.Decrement), cancellationToken);

var response = await base.SendAsync(request, cancellationToken);
return response;
}
}
< /code>
Вот прочная сущность (изолированная, .net 8): < /p>
[DurableTask(nameof(RateLimiterEntity))]
public class RateLimiterEntity
{
public int RemainingRequests { get; set; } = 100;
public DateTime ResetTime { get; set; } = DateTime.UtcNow.AddSeconds(60);

public void Reset()
{
RemainingRequests = 100;
ResetTime = DateTime.UtcNow.AddSeconds(60);
}

public void Decrement()
{
RemainingRequests--;
}

[Function(nameof(RateLimiterEntity))]
public static Task Run([EntityTrigger] TaskEntityDispatcher dispatcher)
=> dispatcher.DispatchAsync();
}
Так, как правильно зарегистрировать DurableTaskClient и получить доступ к сущности из делегирующих рук?

Подробнее здесь: https://stackoverflow.com/questions/794 ... inghandler
Ответить

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

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

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

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

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