如何将控制台项目中的Blazor .NET 5.0网站托管到Windows Service
Blazor .NET 5.0 站点托管到Windows Service 实现方案
1. 安装必要NuGet包
在项目中安装Windows服务适配包,版本选择匹配.NET 5.0的5.x系列即可:
- 包名:
Microsoft.Extensions.Hosting.WindowsServices
2. 调整项目配置生成EXE可执行文件
编辑你的项目.csproj文件,确保包含以下配置:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> <!-- 指定输出为可执行程序 --> <OutputType>Exe</OutputType> <!-- 针对Windows平台生成可执行文件,可根据需求选x86/x64 --> <RuntimeIdentifier>win-x64</RuntimeIdentifier> <!-- 非自包含发布也生成EXE启动器 --> <GenerateExecutable>True</GenerateExecutable> </PropertyGroup> <!-- 其他原有配置保留 --> </Project>
3. 调整Program.cs启动逻辑
修改Program.cs的Host构建逻辑,添加Windows服务适配,同时固定wwwroot路径避免服务运行时工作目录异常导致静态资源找不到:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) // 启用Windows服务运行模式 .UseWindowsService() .ConfigureWebHostDefaults(webBuilder => { // 固定wwwroot路径为程序所在目录下的wwwroot文件夹 webBuilder.UseWebRoot(Path.Combine(AppContext.BaseDirectory, "wwwroot")); webBuilder.UseStartup<Startup>(); // 如果需要指定服务监听端口,可添加以下配置 // webBuilder.UseUrls("http://0.0.0.0:5000"); });
4. 发布项目获取EXE文件
执行以下发布命令,即可在发布输出目录得到可执行EXE文件:dotnet publish -c Release -r win-x64 --self-contained false
参数说明:
--self-contained false表示框架依赖发布,不需要打包.NET运行时,目标机器需要提前安装.NET 5.0桌面运行时- 若希望不需要单独装运行时,可改为
--self-contained true,发布包体积会更大
5. 使用sc.exe注册并启动服务
以管理员身份运行CMD,执行以下命令注册服务:
注意命令中
binPath=、start=后必须保留一个空格sc create "Blazor站点服务" binPath= "C:\你的发布目录\你的程序名.exe" start= auto
注册完成后启动服务:sc start "Blazor站点服务"
如果需要停止/删除服务,可执行:
- 停止服务:
sc stop "Blazor站点服务" - 删除服务:
sc delete "Blazor站点服务"
常见注意事项
- 服务运行的默认账户为Local System,需要给发布目录授予读取权限,若站点有文件写入需求,需额外授予写入权限
- 若站点监听的端口需要外部访问,需要在Windows防火墙中放行对应端口
内容的提问来源于stack exchange,提问作者Banshee
相关产品推荐
相关产品推荐

