У меня есть надежная оркестровка для задания 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#
Место общения программистов C#
1736242579
Anonymous
У меня есть надежная оркестровка для задания ETL, которое загружает данные из внешнего API. Токен для внешнего API хранится в Azure Key Vault.
При оркестрации активируется несколько подоркестраций со множеством функций действий, которым необходимо добавить токен аутентификации в заголовки запросов.
[b]Как лучше всего использовать httpClient с DelegatingHandler, если я хочу избежать ненужного вызова Azure Key Vault для получения того же токена?[/b]
Я внедрение IHttpClientFactory в класс оркестрации, а затем CreateClient в каждую функцию действия.
[b]Должен ли я просто создать один http-клиент в функции оркестратора и передать его в качестве параметра каждой функции действия? , таким образом реализуя обработчик делегирования для добавления заголовка аутентификации?[/b]
Вот пример кода оркестровки. В моей реализации у меня много функций активности, и в каждой из них я создаю 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");
});
Подробнее здесь: [url]https://stackoverflow.com/questions/79335485/use-of-httpclient-with-a-delegatinghandler-in-azure-durable-orchestrations[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия