如何为部署为Windows Service的ASP.NET Core应用配置多环境发布
ASP.NET Core Windows Service多环境发布解决方案
根因说明:web.config是IIS/IIS Express托管场景下才会读取的配置文件,Windows Service模式下应用以独立进程运行,不会加载web.config内的环境变量配置,因此之前生成的配置不生效。
方法1:注册服务时指定环境变量(最推荐,无需改代码)
注册新服务时直接在sc create命令中传入环境变量配置,注意sc命令语法要求等号后必须保留空格:
:: 注册服务时指定环境为Development sc create 自定义服务名 binPath= "你的发布目录\应用入口.exe" DisplayName= "服务显示名称" start= auto Environment= "ASPNETCORE_ENVIRONMENT=Development"
如果是已经注册完成的服务,可通过sc config修改配置:
:: 修改已有服务的环境变量为Staging sc config 现有服务名 Environment= "ASPNETCORE_ENVIRONMENT=Staging"
修改完成后重启服务即可生效。
方法2:发布时通过编译参数固定环境(适合单环境固定发布场景)
无需修改服务注册逻辑,直接在代码中加入编译条件控制环境名称,实现发布命令直接指定环境。
第一步:在项目.csproj文件中加入以下配置:
<PropertyGroup Condition="'$(EnvironmentName)' != ''"> <DefineConstants>ENV_$(EnvironmentName)</DefineConstants> </PropertyGroup>
第二步:修改Program.cs的Host构建逻辑,通过编译指令指定环境:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) #if ENV_Development .UseEnvironment("Development") #elif ENV_Staging .UseEnvironment("Staging") #elif ENV_Production .UseEnvironment("Production") #endif .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) .UseWindowsService();
第三步:直接用你之前的发布命令即可生效:
dotnet publish -c Release -o G:\Project\publish /p:EnvironmentName=Development
方法3:通过服务启动参数指定环境
注册服务时将环境参数直接传入启动命令,ASP.NET Core默认会读取命令行的environment参数作为运行环境:
sc create 自定义服务名 binPath= "你的发布目录\应用入口.exe --environment Development" DisplayName= "服务显示名称" start= auto
内容的提问来源于stack exchange,提问作者Koobz866
相关产品推荐
相关产品推荐

