ServiceBusTrigger:local.settings 到 "cloud" 设置

ServiceBusTrigger: local.settings to "cloud" settings

经过几次尝试,我们能够从本地计算机运行 ServiceBusTrigger 函数。

但是当我们部署到生产环境时,它不起作用。我认为可能是以下3个问题中的任何一个:

1) 对于 serviceBus 触发器,文档说您可以使用任何“servicebusConnectionString”,同时在触发器属性中放置相同的名称,如:

经过大量测试,我们发现只有在 local.settings.json 中放入“值”才有效:

{
  { "values": 
    { "ServicebusConnectionString": "[my SB connStr here]" } 
  }
}

现在,问题是我们必须在已发布的函数中放入什么才能工作

2) 此外,我们还有 local.settings.json 和另一个设置,例如:

{
  { "clients": { "mapId": "AZ45" } 
}

我们应该在 Azure 门户设置中为部署的函数添加什么?

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"];