Azure functions local.settings.json represented in appsettings.json for a ServiceBusTrigger

﹥>﹥吖頭↗ 提交于 2020-05-13 03:39:13

问题


I currently have an azure function using the ServiceBusTrigger binding

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

which uses this local.settings.json file

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

How do I represent this in the appsettings.json file. Will it be like the below?

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

Instead of using a “Values” object can I use eg “MySubs” object like the below?

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

If its possible to use the above settings, how do I represent this in the ServiceBusTrigger binding? would i change it to this?

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

回答1:


You CAN indeed read settings outside the Values array as follows:

WeatherApiConfig.cs

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

New for Azure Functions V2, we have an appropriate way to handle DI as shown below:

Startup.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**"
  }
}

Note: The key for me was to add .SetBasePath(Directory.GetCurrentDirectory()) in Startup.cs since it couldn't find the file without it.

In production I use the function app's Application Settings section to configure these two properties as follows:




回答2:


I am afraid it's not possible. It's by design that locally Azure Function read Values in local.settings.json file to retrieve settings related to bindings.

Check the description for Values in local.settings.json.

Collection of application settings and connection strings used when running locally. These values correspond to app settings in your function app in Azure, such as AzureWebJobsStorage and AzureWebJobsDashboard.

Many triggers and bindings have a property that refers to a connection string app setting, such as Connection for the Blob storage trigger. For such properties, you need an application setting defined in the Values array.

For production, i.e. on Azure site, we can only rely on Application settings to retrieve settings related to bindings.



来源:https://stackoverflow.com/questions/54008309/azure-functions-local-settings-json-represented-in-appsettings-json-for-a-servic

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!