.net core Azure函数:从local.settings.json以外的其他文件获取连接字符串

.net core Azure函数:从local.settings.json以外的其他文件获取连接字符串,.net-core,azure-functions,.net Core,Azure Functions,我有一个azure functions.net core 2.2项目。 有一类: public static class A { [FunctionName("abc")] public static async Task RunAsync( [ServiceBusTrigger("topic1", "sub1", Connection = "ServiceBusConnectionString")] string msg,

我有一个azure functions.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)
        {
            //...
        }
    }
它使用ServiceBustigger连接可从
local.settings.json
文件获得
是否可以将连接字符串放在不同的文件中,例如
secret.settings.json
?如何强制ServiceBustigger从本地.settings.json以外的其他文件获取连接参数值

local.settings.json:

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

您可以使用
ConfigurationBuilder
添加多个
secrets.settings.json
prod.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;
            });
        }
    }
}
[程序集:WebJobsStartup(类型(启动))]
名称空间MyFunctionApp
{
公共类启动:IWebJobsStartup
{
公共void配置(IWebJobsBuilder生成器)
{
var config=new ConfigurationBuilder()
.SetBasePath(context.FunctionAppDirectory)
.AddJsonFile(“local.settings.json”,可选:true,重载更改:true)
.AddJsonFile(“secret.settings.json”,可选:true,重载更改:true)
.AddenEnvironmentVariables()
.Build();
var myString=config[“MyCustomStringSetting”];
builder.Services.PostConfigure
{
serviceBusOptions.Connection=myString;
});
}
}
}

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

分配给
连接的值必须是常量。该值还表示来自
local.settings.json
的设置名称,因此,如果我试图将连接字符串分配给
connection
属性,则该设置将不起作用。@ael更新了我的答案,请尝试。它应该可以工作,我不知道它是否是故意的,但是有
ServiceBusAttribute
而不是
servicebustriggeratAttribute
?下面是代码行:
postconfigure使其工作,但是,我通过添加以下行替换了根配置:“builder.Services.AddSingleton(config);”。您也不需要后配置。