Azure函数:从不是local.settings.json的其他文件获取连接字符串

时间:2019-10-22 10:04:39

标签: .net-core azure-functions

我有一个azure函数.net core 2.2项目。 有一个课程:

    public static class A
    {
        [FunctionName("abc")]
        public static async Task RunAsync(
            [ServiceBusTrigger("topic1", "sub1", Connection = "ServiceBusConnectionString")] string msg,
            [Inject] IInsertOrderAzureSqlFunction functionRunner)
        {
            //...
        }
    }

使用ServiceBusTrigger。从Connection文件获得了local.settings.json的ServiceBusTrigger。
是否可以将连接字符串放在不同的文件中,例如secret.settings.json?如何强制ServiceBusTrigger从local.settings.json以外的其他文件中获取连接参数值

local.settings.json:

{
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "AzureWebJobsDashboard": "UseDevelopmentStorage=true",
    "ServiceBusConnectionString": "connectionStringValue1",
    "SqlConnection": "connectionStringValue2"
  }
}

1 个答案:

答案 0 :(得分:0)

您可以利用ConfigurationBuilder添加多个secrets.settings.jsonprod.settings.json等并动态加载。下面的示例代码。

假设您有一个secrets.settings.json这样的人

{
  "ConnectionStrings": {
    "SqlConnectionString": "server=myddatabaseserver;user=tom;password=123;"
  },
  "MyCustomStringSetting": "Override Some Name",
  "MailSettings": {
    "PrivateKey": "xYasdf5678asjifSDFGhasn1234sDGFHg"
  }
}

更新1

使用IWebJobsStartup进行依赖注入,您可以通过这种方式完成。

[assembly: WebJobsStartup(typeof(Startup))]
namespace MyFunctionApp
{
    public class Startup : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder builder)
        {

            var config = new ConfigurationBuilder()
        .SetBasePath(context.FunctionAppDirectory)
        .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
        .AddJsonFile("secret.settings.json", optional: true, reloadOnChange: true)
        .AddEnvironmentVariables()
        .Build();

        var myString = config["MyCustomStringSetting"];
         builder.Services.PostConfigure<ServiceBusAttribute(serviceBusOptions =>
            {
                serviceBusOptions.Connection = myString;
            });
        }
    }
}

如果属性未设置连接字符串,则触发器将仅使用options.ConnectionString值。因此,在函数定义中,请确保将ConnectionStringSetting设置为""