У меня есть надежная оркестровка для задания ETL, которое загружает данные из внешнего API. Токен для внешнего API хранится в Azure Key Vault.
При оркестрации активируется несколько подоркестраций со множеством функций действий, которым необходимо добавить токен аутентификации в заголовки запросов.
Как лучше всего использовать httpClient с DelegatingHandler, если я хочу избежать ненужного вызова Azure Key Vault для получения того же токена?
Я внедрение IHttpClientFactory в класс оркестрации, а затем CreateClient в каждую функцию действия.
Должен ли я просто создать один http-клиент в функции оркестратора и передать его в качестве параметра каждой функции действия? , таким образом реализуя обработчик делегирования для добавления заголовка аутентификации?
Вот пример кода оркестровки. В моей реализации у меня много функций активности, и в каждой из них я создаю httpclient.
public class ETLOrchestration
{
private readonly IHttpClientFactory _factory;
public ETLOrchestration(IHttpClientFactory factory)
{
_factory = factory;
}
[Function(nameof(ETLOrchestration))]
public static async Task RunOrchestrator(
[OrchestrationTrigger] TaskOrchestrationContext context)
{
ILogger logger = context.CreateReplaySafeLogger(nameof(ETLOrchestration));
string token = await context.CallActivityAsync(nameof(GetAccesToken));
if (string.IsNullOrEmpty(token))
{
throw new Exception("No access token found for ETL in the KeyVault.");
}
logger.LogInformation("Access token retrieved from KeyVault.");
// Should I be creating the http client here and passing it instead of the token?
await context.CallActivityAsync(nameof(ETLActivity), token);
}
[Function("ETLOrchestration_HttpStart")]
public static async Task HttpStart(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req,
[DurableClient] DurableTaskClient client,
FunctionContext executionContext)
{
ILogger logger = executionContext.GetLogger("ETLOrchestration_HttpStart");
string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(nameof(ETLOrchestration));
return await client.CreateCheckStatusResponseAsync(req, instanceId);
}
[Function(nameof(GetAccesToken))]
public async Task GetAccesToken([ActivityTrigger] FunctionContext executionContext)
{
ILogger logger = executionContext.GetLogger(nameof(GetAccesToken));
string accessToken = string.Empty;
// Use the KeyVault to get the access token
string kvUri = "https://key-vault";
var kv_client = new SecretClient(new Uri(kvUri), new DefaultAzureCredential());
try
{
Response accessTokenTask = await kv_client.GetSecretAsync($"ETL-secret");
return accessTokenTask.Value.Value;
}
catch (RequestFailedException)
{
logger.LogCritical("No access token found for ETL in the KeyVault.");
return string.Empty;
}
}
[Function(nameof(ETLActivity))]
public async Task ETLActivity([ActivityTrigger] string accessToken, FunctionContext executionContext)
{
ILogger logger = executionContext.GetLogger(nameof(ETLActivity));
HttpClient http_client = _factory.CreateClient("SomeAPIClient");
http_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var httpResponse = await http_client.GetAsync($"some-api/data");
//...
}
}
А в Program.cs у меня есть именованный http-клиент:
services.AddHttpClient("SomeAPIClient", http_client =>
{
http_client.BaseAddress = new Uri(Environment.GetEnvironmentVariable("BaseUrlSomeAPI");
});
Подробнее здесь: https://stackoverflow.com/questions/793 ... estrations
Использование HttpClient с DelegatingHandler в устойчивых оркестрациях Azure ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Использование HttpClient с DelegatingHandler в устойчивых оркестрациях Azure
Anonymous » » в форуме C# - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Ограничения в устойчивых функциях Azure. Макс. действия и оркестраторы
Anonymous » » в форуме Python - 0 Ответы
- 38 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Ограничения в устойчивых функциях Azure. Макс. действия и оркестраторы
Anonymous » » в форуме Python - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-