适用于ServiceBusTrigger的appsettings.json中表示的Azure函数local.settings.json

One*_*eil 1 c# azure azureservicebus azure-functions

我目前使用ServiceBusTrigger绑定具有azure函数

 [ServiceBusTrigger("%TopicName%", "%SubscripionName%", Connection = "MyConnection")]
         string  catclogueEventMsgs, ILogger log, ExecutionContext context)
Run Code Online (Sandbox Code Playgroud)

使用此local.settings.json文件

   "Values": {
             …
    "MyConnection": "Endpoint=sb://testxxxxxxxxxxxxxxxxxx
    "SubscriptionName": "testsubscriptionName"
    "TopicName": "testtopicName",
  }
Run Code Online (Sandbox Code Playgroud)

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

   "Values": {
    "MyConnection": "Endpoint=sb://testxxxxxxxxxxxxxxxxxx
    "SubscriptionName": "testsubscriptionName"
    "TopicName": "testtopicName",
  }
Run Code Online (Sandbox Code Playgroud)

我可以使用“ MySubs”对象代替如下的“ Values”对象吗?

   "MySubs": {
    "MyConnection": "Endpoint=sb://testxxxxxxxxxxxxxxxxxx
    "SubscriptionName": "testsubscriptionName"
    "TopicName": "testtopicName",
  }
Run Code Online (Sandbox Code Playgroud)

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

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

Jas*_*SFT 5

您确实可以Values按如下方式读取阵列之外的设置:

WeatherApiConfig.cs

public class WeatherApiConfig
{
    public string WeatherApiUrl { get; set; }
    public string WeatherApiKey { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

启动文件

[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.GetSection("WeatherApiConfig").Bind(apiConfig);

            builder.Services.AddSingleton(apiConfig);
            builder.Services.AddHttpClient();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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**"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Azure中的应用程序设置

  • 这是一个巧妙的解决方法。我只想指出这使用了配置系统的新实例,并且您的依赖项注入不再基于 IOptions<T> 。如果您想要这个或除此之外还需要这个,您仍然需要通过 builder.Services.AddOptions<>().Configure<Iconfiguration>() 等进行配置,至少从 v3 开始。 (2认同)