首页 > 解决方案 > Azure 函数 local.settings.json 在 appsettings.json 中表示 ServiceBusTrigger

问题描述

我目前有一个使用 ServiceBusTrigger 绑定的天蓝色函数

 [ServiceBusTrigger("%TopicName%", "%SubscripionName%", Connection = "MyConnection")]
         string  catclogueEventMsgs, ILogger log, ExecutionContext context)

它使用这个 local.settings.json 文件

   "Values": {
             …
    "MyConnection": "Endpoint=sb://testxxxxxxxxxxxxxxxxxx
    "SubscriptionName": "testsubscriptionName"
    "TopicName": "testtopicName",
  }

我如何在 appsettings.json 文件中表示这一点。会像下面这样吗?

   "Values": {
    "MyConnection": "Endpoint=sb://testxxxxxxxxxxxxxxxxxx
    "SubscriptionName": "testsubscriptionName"
    "TopicName": "testtopicName",
  }

除了使用“Values”对象之外,我还可以使用如下所示的“MySubs”对象吗?

   "MySubs": {
    "MyConnection": "Endpoint=sb://testxxxxxxxxxxxxxxxxxx
    "SubscriptionName": "testsubscriptionName"
    "TopicName": "testtopicName",
  }

如果可以使用上述设置,我如何在 ServiceBusTrigger 绑定中表示它?我会把它改成这个吗?

 [ServiceBusTrigger("%MySubs.TopicName%", "%MySubs.SubscripionName%", Connection = "MySubs.MyConnection")]
         string  catclogueEventMsgs, ILogger log, ExecutionContext context)

标签: c#azureazure-functionsazureservicebus

解决方案


您确实可以读取Values数组外的设置,如下所示:

WeatherApiConfig.cs

public class WeatherApiConfig
{
    public string WeatherApiUrl { get; set; }
    public string WeatherApiKey { get; set; }
}

Azure Functions V2 的新增功能,我们有一种适当的方式来处理 DI,如下所示:

启动.cs

[assembly: FunctionsStartup(typeof(BlazingDemo.Api.Startup))]

namespace BlazingDemo.Api
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            var config = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();

            var apiConfig = new WeatherApiConfig();
            config.Bind(nameof(WeatherApiConfig), apiConfig);

            builder.Services.AddSingleton(apiConfig);
            builder.Services.AddHttpClient();
        }
    }
}

Local.settings.json

{  
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet"
  },
  "WeatherApiConfig": {
    "WeatherApiUrl": "http://api.openweathermap.org/data/2.5/weather",
    "WeatherApiKey": "**removed**"
  }
}

注意:对我来说关键是添加.SetBasePath(Directory.GetCurrentDirectory())Startup.cs因为没有它就找不到文件。

在生产中,我使用函数应用的Application Settings部分来配置这两个属性,如下所示:

Azure 中的应用程序设置


推荐阅读