C# Visual Studio在发布过程中使用launchSettings.json配置文件中定义的以下哪种配置文件?

C# Visual Studio在发布过程中使用launchSettings.json配置文件中定义的以下哪种配置文件?,c#,visual-studio,iis,asp.net-core,web-config,C#,Visual Studio,Iis,Asp.net Core,Web Config,我正在尝试配置ASP.NET核心项目发布配置文件,以便部署到临时环境。服务器上设置了预配置的ASPNETCORE_环境变量,但无论我尝试什么,Visual Studio都会将ASPNETCORE_环境变量定义添加到publishing web.config文件中。消除它的唯一方法是从launchSettings.json中删除 这导致了几个问题: 虽然docs.microsoft.com说这个选项应该完全 重写环境变量,实际上是 HostingEnvironment.EnvironmentNam

我正在尝试配置ASP.NET核心项目发布配置文件,以便部署到临时环境。服务器上设置了预配置的ASPNETCORE_环境变量,但无论我尝试什么,Visual Studio都会将ASPNETCORE_环境变量定义添加到publishing web.config文件中。消除它的唯一方法是从launchSettings.json中删除

这导致了几个问题:

  • 虽然docs.microsoft.com说这个选项应该完全 重写环境变量,实际上是 HostingEnvironment.EnvironmentName属性设置为 “Staging;Environment”,环境变量和web.config设置的连接值
  • 因此,防止适当的 appsettings.{environment}.json从load中删除并中断所有环境感知逻辑
  • 我更愿意将ASPNETCORE_环境保存在launchSettings.json中进行调试
  • 我找不到任何控制这种行为的设置。有吗

    这是我的.pubxml

    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <WebPublishMethod>MSDeploy</WebPublishMethod>
        <LastUsedBuildConfiguration>Release.Main</LastUsedBuildConfiguration>
        <LastUsedPlatform>Any CPU</LastUsedPlatform>
        <SiteUrlToLaunchAfterPublish />
        <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
        <ExcludeApp_Data>False</ExcludeApp_Data>
        <TargetFramework>netcoreapp2.2</TargetFramework>
        <RuntimeIdentifier>win-x64</RuntimeIdentifier>
        <ProjectGuid>433bb565-5e85-4f1a-9dd4-a7f437fdb534</ProjectGuid>
        <SelfContained>false</SelfContained>
        <_IsPortable>true</_IsPortable>
        <MSDeployServiceURL>http://192.168.0.22</MSDeployServiceURL>
        <DeployIisAppPath>auth/main</DeployIisAppPath>
        <RemoteSitePhysicalPath />
        <SkipExtraFilesOnServer>True</SkipExtraFilesOnServer>
        <MSDeployPublishMethod>RemoteAgent</MSDeployPublishMethod>
        <EnableMSDeployBackup>True</EnableMSDeployBackup>
        <_SavePWD>False</_SavePWD>
      </PropertyGroup>
    </Project>
    
    部署的web.config

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <location path="." inheritInChildApplications="false">
        <system.webServer>
          <handlers>
            <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
          </handlers>
          <aspNetCore processPath="..." arguments="..." stdoutLogEnabled="false" hostingModel="InProcess" stdoutLogFile=".\logs\stdout">
            <environmentVariables>
              <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
            </environmentVariables>
          </aspNetCore>
        </system.webServer>
      </location>
    </configuration>
    <!--ProjectGuid: 706412a5-be0d-452d-a9b0-ce00d799f990-->
    

    Visual Studio仅在调试期间和通过
    dotnet run运行应用程序时使用
    launchSettings.json
    文件。发布时根本不使用它,甚至不考虑它。如果要在发布时指定特定环境,则需要向
    pubxml
    文件中添加
    Staging

    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
          ...
          <EnvironmentName>Staging</EnvironmentName>
      </PropertyGroup>
    </Project>
    
    
    ...
    登台
    
    这将在发布的web.config中为
    ASPNETCORE\u环境
    添加环境变量声明,并将其设置为
    Staging

    但是,这需要考虑以下几点:

  • 您正在使用IIS托管。只有IIS关心web.config文件,因此如果您使用不同的web服务器托管,显然需要不同的策略
  • 首先,您希望将发布的应用程序实际绑定到特定环境。ASP.NET核心应用程序的优点之一是它们不是为特定环境构建的,例如ASP.NET应用程序。您可以获取相同的已发布代码并将其放到任何环境中。然后,可以使用服务器上的
    ASPNETCORE\u ENVIRONMEMT
    环境变量设置环境(即,对于登台服务器,将其设置为
    登台
    ,然后在那里发布的任何应用程序都将自动使用
    登台
    环境。或者,如果您使用的是Azure,则可以使用应用程序设置进行设置。在任何一种情况下,您都可以从实际发布代码中抽象出环境,从而允许您执行CI/CD管道,而无需使用必须经常发表

  • launchSettings.json
    文件仅在调试期间以及通过
    dotnet run
    运行应用程序时由Visual Studio使用。发布时根本不使用该文件,甚至不考虑该文件。如果要在发布时指定特定环境,则需要向
    pubxml
    文件添加
    Staging

    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
          ...
          <EnvironmentName>Staging</EnvironmentName>
      </PropertyGroup>
    </Project>
    
    
    ...
    登台
    
    这将在发布的web.config中为
    ASPNETCORE\u环境
    添加环境变量声明,并将其设置为
    Staging

    但是,这需要考虑以下几点:

  • 只有IIS才关心web.config文件,因此如果您使用不同的web服务器托管,显然需要不同的策略
  • 您希望首先将已发布的应用程序实际绑定到特定环境。ASP.NET核心应用程序的优点之一是,它们不是为特定环境构建的,例如ASP.NET应用程序。您可以获取相同的已发布代码并将其放到任何环境中。然后,可以使用服务器上的
    ASPNETCORE\u环境变量(即,对于登台服务器,将其设置为
    登台
    ,然后在那里发布的任何应用程序都将自动使用
    登台
    环境。或者,如果您使用的是Azure,则可以使用应用程序设置进行设置。在任何一种情况下,您都可以从实际发布代码中抽象出环境,从而允许您执行CI/CD管道,而无需使用必须经常发表

  • 你需要在你的
    pubxml
    文件中添加
    Development
    。我的意思是,在你的文件中添加这个键,但是要使用适当的环境。这应该在你生成的
    Web.Config
    @jpgrassi中添加一个
    environmentVariables
    部分,因为即使它设置了对于适当的环境,运行时的EnvironmentName是evironment变量和web.config中用分号分隔的值串联的结果,例如Staging;Staging,Staging;Development等。那么,这很奇怪。我刚刚创建了一个示例应用程序,使用WebDeploy,它为我正确添加了环境。您尝试了crea吗设置一个新的
    profile
    并设置为FileSystem,只是为了测试一下?@jpgrassi好吧,我的意思是在服务器上设置了预配置的ASPNETCORE_环境变量,当它也设置为web.config时,结果值不会被覆盖(如MS文档中所述)因此,问题是如何将其保留在launchSettings.json中进行本地调试,但在部署时在web.config中将其删除您需要在
    pubxml
    文件中添加
    Development
    。我的意思是,在您的文件中添加此键,但要使用适当的环境。这应该添加
    environmentVariablesWeb.Config
    @jpgrassi中,de>部分我希望Web.Config中不会有任何ASPNETCORE\u环境,因为即使它设置为适当的环境,运行时的EnvironmentName也是evironment变量和