extensions/Worker.Extensions.Shared/Configuration/ConfigurationExtensions.cs (62 lines of code) (raw):
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
using System;
using System.Globalization;
using Microsoft.Extensions.Configuration;
namespace Microsoft.Azure.Functions.Worker.Extensions
{
internal static class ConfigurationExtensions
{
private const string WebJobsConfigurationSectionName = "AzureWebJobs";
private const string ConnectionStringsConfigurationSectionName = "ConnectionStrings";
/// <summary>
/// Gets the configuration section for a given connection name.
/// </summary>
/// <param name="configuration">The configuration.</param>
/// <param name="connectionName">The connection string key.</param>
internal static IConfigurationSection GetWebJobsConnectionStringSection(this IConfiguration configuration, string connectionName)
{
// first try prefixing
string prefixedConnectionStringName = GetPrefixedConnectionStringName(connectionName);
IConfigurationSection section = configuration.GetConnectionStringOrSetting(prefixedConnectionStringName);
if (!section.Exists())
{
// next try a direct un-prefixed lookup
section = configuration.GetConnectionStringOrSetting(connectionName);
}
return section;
}
/// <summary>
/// Either constructs the serviceUri from the provided accountName
/// or retrieves the serviceUri for the specific resource (i.e. blobServiceUri or queueServiceUri)
/// </summary>
/// <param name="configuration">configuration section for a given connection name </param>
/// <param name="subDomain">The subdomain of the serviceUri (i.e. blob, queue, table)</param>
/// <param name="serviceUri">The serviceUri for the specific resource (i.e. blobServiceUri or queueServiceUri)</param>
internal static bool TryGetServiceUriForStorageAccounts(this IConfiguration configuration, string subDomain, out Uri serviceUri)
{
if (subDomain is null)
{
throw new ArgumentNullException(nameof(subDomain));
}
var serviceUriConfig = string.Format(CultureInfo.InvariantCulture, "{0}ServiceUri", subDomain);
if (configuration.GetValue<string>("accountName") is { } accountName)
{
serviceUri = FormatServiceUri(accountName, subDomain);
return true;
}
else if (configuration.GetValue<string>($"{subDomain}ServiceUri") is { } uriStr)
{
serviceUri = new Uri(uriStr);
return true;
}
serviceUri = default(Uri)!;
return false;
}
/// <summary>
/// Generates the serviceUri for a particular storage resource
/// </summary>
private static Uri FormatServiceUri(string accountName, string subDomain, string defaultProtocol = "https", string endpointSuffix = "core.windows.net")
{
var uri = string.Format(CultureInfo.InvariantCulture, "{0}://{1}.{2}.{3}", defaultProtocol, accountName, subDomain, endpointSuffix);
return new Uri(uri);
}
/// <summary>
/// Creates a WebJobs specific prefixed string using a given connection name.
/// </summary>
/// <param name="connectionName">The connection string key.</param>
private static string GetPrefixedConnectionStringName(string connectionName)
{
return WebJobsConfigurationSectionName + connectionName;
}
/// <summary>
/// Looks for a connection string by first checking the ConfigurationStrings section, and then the root.
/// </summary>
/// <param name="configuration">The configuration.</param>
/// <param name="connectionName">The connection string key.</param>
private static IConfigurationSection GetConnectionStringOrSetting(this IConfiguration configuration, string connectionName)
{
if (configuration.GetSection(ConnectionStringsConfigurationSectionName).Exists())
{
IConfigurationSection onConnectionStrings = configuration.GetSection(ConnectionStringsConfigurationSectionName).GetSection(connectionName);
if (onConnectionStrings.Exists())
{
return onConnectionStrings;
}
}
return configuration.GetSection(connectionName);
}
}
}