Можно ли использовать AzureAppConfiguration вместе с функцией Azure ServiceBusTrigger
Сегодня у меня есть функция Azure с ServiceBusTrigger, которая считывает значения из моего файла настроек. Нравится:
[FunctionName("BookingEventListner")]
public static async Task Run([ServiceBusTrigger("%topic_name%", "%subscription_name%", Connection = "BookingservicesTopicEndpoint")]Microsoft.Azure.ServiceBus.Message mySbMsg, ILogger log)
{
Но я использую Конфигурацию приложения Azure с другими проектами в этом решении и хотел бы также сохранить конечную точку, тему и подскрипт в Конфигурации приложения Azure (добавление их не является проблемой, но их получение).
Есть ли какой-нибудь способ добавить провайдера AzureAppConfiguration в обработчик конфигурации, просто что я могу сделать в веб-приложении?
webHostBuilder.ConfigureAppConfiguration((context, config) =>
{
var configuration = config.Build();
config.AddAzureAppConfiguration(options =>
{
var azureConnectionString = configuration[TRS.Shared.AspNetCore.Constants.CONFIGURATION_KEY_AZURECONFIGURATION_CONNECTIONSTRING];
if (string.IsNullOrWhiteSpace(azureConnectionString)
|| !azureConnectionString.StartsWith("Endpoint=https://"))
throw new InvalidOperationException($"Missing/wrong configuration value for key '{Constants.CONFIGURATION_KEY_AZURECONFIGURATION_CONNECTIONSTRING}'.");
options.Connect(azureConnectionString);
});
});
С наилучшими пожеланиями Магнус
2 ответа
Я нашел полезную ссылку здесь: http://marcelegger.net/azure-functions-v2-keyvault-and-iconfiguration
Это помогло мне в пути, и вот как я это делаю. Сначала я создаю метод расширений для интерфейса IWebJobsBuilder.
/// <summary>
/// Set up a connection to AzureAppConfiguration
/// </summary>
/// <param name="webHostBuilder"></param>
/// <param name="azureAppConfigurationConnectionString"></param>
/// <returns></returns>
public static IWebJobsBuilder AddAzureConfiguration(this IWebJobsBuilder webJobsBuilder)
{
//-- Get current configuration
var configBuilder = new ConfigurationBuilder();
var descriptor = webJobsBuilder.Services.FirstOrDefault(d => d.ServiceType == typeof(IConfiguration));
if (descriptor?.ImplementationInstance is IConfigurationRoot configuration)
configBuilder.AddConfiguration(configuration);
var config = configBuilder.Build();
//-- Add Azure Configuration
configBuilder.AddAzureAppConfiguration(options =>
{
var azureConnectionString = config[TRS.Shared.Constants.CONFIGURATION.KEY_AZURECONFIGURATION_CONNECTIONSTRING];
if (string.IsNullOrWhiteSpace(azureConnectionString)
|| !azureConnectionString.StartsWith("Endpoint=https://"))
throw new InvalidOperationException($"Missing/wrong configuration value for key '{TRS.Shared.Constants.CONFIGURATION.KEY_AZURECONFIGURATION_CONNECTIONSTRING}'.");
options.Connect(azureConnectionString);
});
//build the config again so it has the key vault provider
config = configBuilder.Build();
//replace the existing config with the new one
webJobsBuilder.Services.Replace(ServiceDescriptor.Singleton(typeof(IConfiguration), config));
return webJobsBuilder;
}
Где azureConnectionString читается из вашего appsetting.json и должен содержать URL-адрес конфигурации приложения Azure.
Когда это будет сделано, нам нужно создать класс запуска в проекте Azure Func, который будет выглядеть следующим образом.
public class Startup : IWebJobsStartup
{
//-- Constructor
public Startup() { }
//-- Methods
public void Configure(IWebJobsBuilder builder)
{
//-- Adds a reference to our Azure App Configuration so we can store our variables there instead of in the local settings file.
builder.AddAzureConfiguration();
ConfigureServices(builder.Services)
.BuildServiceProvider(true);
}
private IServiceCollection ConfigureServices(IServiceCollection services)
{
services.AddLogging();
return services;
}
}
в моем классе func теперь я могу извлечь значения из моей конфигурации приложения Azure точно так, как если бы они были записаны в моем файле appsetting.json.
[FunctionName("FUNCTION_NAME")]
public async Task Run([ServiceBusTrigger("%KEYNAME_FOR_TOPIC%", "%KEYNAME_FOR_SUBSCRIPTION%", Connection = "KEY_NAME_FOR_SERVICEBUS_ENDPOINT")]Microsoft.Azure.ServiceBus.Message mySbMsg
, ILogger log)
{
log.LogInformation($"C# ServiceBus topic trigger function processed message: {mySbMsg.MessageId}");
}
Вы можете использовать ServiceBusTriggerAttribute для достижения этого.
Сначала используйте AddAzureAppConfiguration, чтобы получить конечную точку, тему и нижний индекс.
var builder = new ConfigurationBuilder();
builder.AddAzureAppConfiguration(Environment.GetEnvironmentVariable("ConnectionString"));
var config = builder.Build();
string message = config["TestApp:Settings:Message"];
Тогда используйте ServiceBusTriggerAttribute
Чтобы взять имя темы и подписку, чтобы связать атрибут.
var attributes = new Attribute[]
{
new ServiceBusAccountAttribute("yourservicebusname"),
new ServiceBusTriggerAttribute(topic,sub)
};
var outputSbMessage = await binder.BindAsync<IAsyncCollector<BrokeredMessage>>(attributes);