问题
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())
inStartup.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