【问题标题】:Hosting environment why is it set to Production, Difference between host.json and local.settings.json托管环境为什么设置为生产,host.json 和 local.settings.json 之间的区别
【发布时间】:2026-01-04 04:15:02
【问题描述】:

我有两个关于功能的 .net 核心应用程序的问题。我正在使用blobtrigger。

1) 当我在本地运行我的项目时,我在命令提示符控制台上得到了这个“托管环境”,我想了解这个变量在哪里设置以及如何将其更改为开发。由于我只是在本地开发,因此具有误导性。

[5/23/2019 7:00:20 PM] 主机已启动(773 毫秒) [5/23/2019 7:00:20 PM] 作业主机开始 托管环境:生产 内容根路径:C:Myproject\bin\Debug\netcoreapp2.1 现在收听:http://0.0.0.0:7071

2) host.json 和 local.settings.json 有什么区别。什么时候可以使用host.json?到目前为止,我只使用了 local.settings.json,当我发布到天蓝色时,我正在创建 local.settings.json 中提到的配置,但没有使用 Host.json,它看起来像。 host.json 文件的用途是什么。

【问题讨论】:

    标签: azure azure-functions


    【解决方案1】:

    有时,大多数时候,Microsoft 有奇怪的做事方式......我们作为社区必须找到解决它们的方法,或者顺从它们。好吧,如果您是那些无法接受没有意义的想法的人之一,那么这里有一个解决方案:

    1. 删除local.settings.json
    2. 为您的环境创建两个文件(或多个文件),并将它们命名为{environment}.local.settings.json 例如:development.local.settings.jsonproduction.local.settings.json
    3. 创建一个任务,将当前环境文件复制到local.settings.json

    我们又来了:我们必须重复任务...

    [
      {
        "label": "use development.local.settings.json",
        "command": "cp development.local.settings.json local.settings.json",
        "type": "shell",
        "options": {
          "cwd": "${workspaceFolder}/..."
        }
      },
      {
        "label": "use production.local.settings.json",
        "command": "cp production.local.settings.json local.settings.json",
        "type": "shell",
        "options": {
          "cwd": "${workspaceFolder}/..."
        }
      },
      {
        "label": "azure-func-development",
        "type": "func",
        "dependsOn": [
          "use development.local.settings.json",
          "build"
        ],
        "dependsOrder": "sequence",
        "options": {
          "cwd": "${workspaceFolder}/.../bin/Debug/netcoreapp2.2"
        },
        "command": "host start",
        "isBackground": true,
        "problemMatcher": "$func-watch"
      },
      {
        "label": "azure-func-production",
        "type": "func",
        "dependsOn": [
          "use production.local.settings.json",
          "build"
        ],
        "dependsOrder": "sequence",
        "options": {
          "cwd": "${workspaceFolder}/.../bin/Debug/netcoreapp2.2"
        },
        "command": "host start",
        "isBackground": true,
        "problemMatcher": "$func-watch"
      }
    ]
    

    别累了,我们还没复制完呢……

    让我们复制launch.json 配置:

    [
      {
        "name": "[Development] Attach to Azure .NET Functions",
        "type": "coreclr",
        "request": "attach",
        "preLaunchTask": "azure-func-development",
        "processId": "${command:azureFunctions.pickProcess}"
      },
      {
        "name": "[Production] Attach to Azure .NET Functions",
        "type": "coreclr",
        "request": "attach",
        "preLaunchTask": "azure-func-production",
        "processId": "${command:azureFunctions.pickProcess}"
      }
    ]
    

    【讨论】:

      【解决方案2】:

      控制台上的“托管环境”来自环境变量ASPNETCORE_ENVIRONMENT。未设置此变量时,默认为“Production”。

      设置在这里:HostingEnvironment.cs

      github issue 中描述了此默认值背后的原因。

      这个变量在 dotnet core web 应用程序中很流行,但在 Azure 函数的官方文档中没有提到(我不知道为什么)。如果您编写一个 for 循环并从函数内将所有环境变量输出到控制台,您会发现默认情况下未设置此变量 - 无论是在生产中,还是在 Visual Studio 中运行时。

      如果你想在本地定义这个变量,你有几种不同的方法。

      通过命令行设置环境变量:

      setx ASPNETCORE_ENVIRONMENT "Development"
      

      在 Properties\launchSettings.json 中定义:

        "commandName": "Project",
        "environmentVariables": {
          "ASPNETCORE_ENVIRONMENT": "Development"
        }
      

      在 local.settings.json 中定义:

        "Values": {
          "ASPNETCORE_ENVIRONMENT": "Development"
        }
      

      请注意,当您将应用发布到 azure 时,此变量不会自动定义到生产环境。您必须在 Azure 门户的“配置”->“应用程序设置”中定义此变量。

      在 azure 函数中似乎还有另一个类似的环境变量,称为 AZURE_FUNCTIONS_ENVIRONMENT。这是在本地默认定义的。

      AZURE_FUNCTIONS_ENVIRONMENT = Development
      

      这个在生产中默认是没有定义的,可以在天蓝色的门户中定义。

      host.json 和 local.settings.json 的区别

      host.json 用于配置功能应用基础架构可以理解的预定义设置。它适用于本地和生产环境。但它不允许自定义设置。另一方面,local.settings.json 对于定义自定义设置很有用。 host.json 被提交到源代码控制中,但 local.settings.json 通常被排除在源代码控制之外,并且被认为是存储机密和连接字符串以进行开发的好位置。

      这里有更多关于差异的详细信息:https://docs.microsoft.com/en-us/azure/azure-functions/functions-develop-vs#create-an-azure-functions-project(滚动到该部分的末尾)

      host.json reference

      local.settings.json reference

      【讨论】:

        【解决方案3】:
        1. 您可以在local.settings.json中添加"ASPNETCORE_ENVIRONMENT": "Development",以更改托管环境:

        1. 如您所知,local.settings.json 仅用于本地测试,不会发布到 Azure 门户。对于 host.json(将发布到 azure),您可以在 azure 门户中配置日志级别(如果要登录)等设置。更多详情请参考host.json这篇文章。

        【讨论】: