ServiceBusTrigger:local.settings 到 "cloud" 设置
ServiceBusTrigger: local.settings to "cloud" settings
经过几次尝试,我们能够从本地计算机运行 ServiceBusTrigger 函数。
但是当我们部署到生产环境时,它不起作用。我认为可能是以下3个问题中的任何一个:
1)
对于 serviceBus 触发器,文档说您可以使用任何“servicebusConnectionString”,同时在触发器属性中放置相同的名称,如:
经过大量测试,我们发现只有在 local.settings.json 中放入“值”才有效:
{
{ "values":
{ "ServicebusConnectionString": "[my SB connStr here]" }
}
}
现在,问题是我们必须在已发布的函数中放入什么才能工作
- 只是 ServicebusConnectionString?
- Values_ServicebusConnectionString?
- Values.ServicebusConnectionString?
- VALUES_SERVICEBUS_CONNECTION_STRING?
2)
此外,我们还有 local.settings.json 和另一个设置,例如:
{
{ "clients": { "mapId": "AZ45" }
}
我们应该在 Azure 门户设置中为部署的函数添加什么?
- clients_map_id?
- clients.mapId?
- CLIENTS_MAP_ID?
3)
我们的函数是在 .Net5 中开发的,但是 Azure Portal 只允许使用 .Net Core 3.5 或 .Net6 创建函数服务。我们选择了 .Net6,假设它具有向后兼容性。我认为这不会造成问题,但谁知道呢。
我想强调的是,当 运行 从 Visual Studio 进行调试时,一切正常。读取所有设置并按预期触发触发器。
部署后,我们没有在日志中看到任何错误,但消息不会在我们的 ServiceBus 中使用,除非我们 运行 本地机器中的函数。所以我们猜测该功能只是由于配置错误而没有启动。
我很困惑,感谢您的指导!
编辑:对于许多人来说,从本地的“values:configValue”切换到生产中的“configValue”是多么自然,这真是令人难以置信。我一定遗漏了一些东西,但对我来说,配置的一个关键方面是保留“键”(如 values:configValue)但根据环境更改内容。比如开发中key是“values:configValue”,在PROD中应该是一样的
local.settings.json
文件应该用于您的本地开发体验。它不适用于生产。按照惯例,您必须将自定义设置条目保存在 Values
元素中。因此,您可以将如下所示的服务总线连接存储在 local.settings.json
文件中。
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
"ServiceBusConnectionString": "your-secret-conn-string-value-here"
}
}
local.appsettings.json
里面的Values
设置是为了存储string-string的键值对类型。 JSON 不支持对象或数组。
对于生产中的服务总线连接字符串,您应该只创建一个与您在代码中使用的名称相同的应用程序设置(ServiceBusTrigger
属性的 Connection
属性值。例如,如果您的函数代码使用的是 ServiceBusTrigger
属性,如下所示
[ServiceBusTrigger("mytopic","mysubscription",
Connection = "ServicebusConnectionString")] object message
对于生产 (azure),您将创建一个新的应用程序设置条目,名称为 ServicebusConnectionString
。 运行时间会阅读并使用它。您不需要 Values
前缀。
默认情况下,当您 运行 您的代码在产品中时,local.settings.json
文件不用作配置源。
编辑:
自创建主机以来,.net 隔离模型(进程外模型)为您提供了更大的灵活性,可以根据您的需要对其进行自定义。例如,如果您想添加另一个 json 文件作为您的配置源(类似于 aspnet 核心应用程序的做法),您可以在 Program.cs
中的 Main
方法中执行此操作您正在构建主机。这是一个简单的例子,
public static Task Main()
{
var host = new HostBuilder()
.ConfigureAppConfiguration((context,config ) =>
{
var env = context.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: false);
config.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: false);
})
.ConfigureFunctionsWorkerDefaults()
.Build();
return host.RunAsync();
}
确保更新文件属性,以便将其复制到输出目录。
现在您可以注入 IConfiguration
或使用 options pattern 将您的配置强类型化为一个类型并将其注入您的 类.
编辑:
要访问嵌套配置 属性 值,您应该使用 :
作为分隔符。例如,如果您添加了如下所示的自定义 JSON 文件作为配置源。
{
"clients": { "mapId": "AZ45-prod" }
}
您可以使用这样的 IConfiguration
实例访问它。
var clientMapId = configuration["clients:mapId"];
经过几次尝试,我们能够从本地计算机运行 ServiceBusTrigger 函数。
但是当我们部署到生产环境时,它不起作用。我认为可能是以下3个问题中的任何一个:
1) 对于 serviceBus 触发器,文档说您可以使用任何“servicebusConnectionString”,同时在触发器属性中放置相同的名称,如:
经过大量测试,我们发现只有在 local.settings.json 中放入“值”才有效:
{
{ "values":
{ "ServicebusConnectionString": "[my SB connStr here]" }
}
}
现在,问题是我们必须在已发布的函数中放入什么才能工作
- 只是 ServicebusConnectionString?
- Values_ServicebusConnectionString?
- Values.ServicebusConnectionString?
- VALUES_SERVICEBUS_CONNECTION_STRING?
2) 此外,我们还有 local.settings.json 和另一个设置,例如:
{
{ "clients": { "mapId": "AZ45" }
}
我们应该在 Azure 门户设置中为部署的函数添加什么?
- clients_map_id?
- clients.mapId?
- CLIENTS_MAP_ID?
3) 我们的函数是在 .Net5 中开发的,但是 Azure Portal 只允许使用 .Net Core 3.5 或 .Net6 创建函数服务。我们选择了 .Net6,假设它具有向后兼容性。我认为这不会造成问题,但谁知道呢。
我想强调的是,当 运行 从 Visual Studio 进行调试时,一切正常。读取所有设置并按预期触发触发器。
部署后,我们没有在日志中看到任何错误,但消息不会在我们的 ServiceBus 中使用,除非我们 运行 本地机器中的函数。所以我们猜测该功能只是由于配置错误而没有启动。 我很困惑,感谢您的指导!
编辑:对于许多人来说,从本地的“values:configValue”切换到生产中的“configValue”是多么自然,这真是令人难以置信。我一定遗漏了一些东西,但对我来说,配置的一个关键方面是保留“键”(如 values:configValue)但根据环境更改内容。比如开发中key是“values:configValue”,在PROD中应该是一样的
local.settings.json
文件应该用于您的本地开发体验。它不适用于生产。按照惯例,您必须将自定义设置条目保存在 Values
元素中。因此,您可以将如下所示的服务总线连接存储在 local.settings.json
文件中。
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
"ServiceBusConnectionString": "your-secret-conn-string-value-here"
}
}
local.appsettings.json
里面的Values
设置是为了存储string-string的键值对类型。 JSON 不支持对象或数组。
对于生产中的服务总线连接字符串,您应该只创建一个与您在代码中使用的名称相同的应用程序设置(ServiceBusTrigger
属性的 Connection
属性值。例如,如果您的函数代码使用的是 ServiceBusTrigger
属性,如下所示
[ServiceBusTrigger("mytopic","mysubscription",
Connection = "ServicebusConnectionString")] object message
对于生产 (azure),您将创建一个新的应用程序设置条目,名称为 ServicebusConnectionString
。 运行时间会阅读并使用它。您不需要 Values
前缀。
默认情况下,当您 运行 您的代码在产品中时,local.settings.json
文件不用作配置源。
编辑:
自创建主机以来,.net 隔离模型(进程外模型)为您提供了更大的灵活性,可以根据您的需要对其进行自定义。例如,如果您想添加另一个 json 文件作为您的配置源(类似于 aspnet 核心应用程序的做法),您可以在 Program.cs
中的 Main
方法中执行此操作您正在构建主机。这是一个简单的例子,
public static Task Main()
{
var host = new HostBuilder()
.ConfigureAppConfiguration((context,config ) =>
{
var env = context.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: false);
config.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: false);
})
.ConfigureFunctionsWorkerDefaults()
.Build();
return host.RunAsync();
}
确保更新文件属性,以便将其复制到输出目录。
现在您可以注入 IConfiguration
或使用 options pattern 将您的配置强类型化为一个类型并将其注入您的 类.
编辑:
要访问嵌套配置 属性 值,您应该使用 :
作为分隔符。例如,如果您添加了如下所示的自定义 JSON 文件作为配置源。
{
"clients": { "mapId": "AZ45-prod" }
}
您可以使用这样的 IConfiguration
实例访问它。
var clientMapId = configuration["clients:mapId"];