不将 IIS 用作 Windows 服务时,可在 Windows 上托管 ASP.NET Core 应用。 作为 Windows 服务托管时,无需人工干预应用即可在重新启动和崩溃后自动启动。 查看或下载示例代码(如何下载) 将项目转换为 Windows 服务 要将现有 ASP.NET Core 项目设置为作为服务运行,至少需要执行以下更改: 在项目文件中: 确认是否存在 Windows 运行时标识符 (RID),或将其添加到包含目标框架的 <PropertyGroup> 中: XML复制
1 2 3 4 5 |
<span class="hljs-tag"><<span class="hljs-name">PropertyGroup</span>></span> <span class="hljs-tag"><<span class="hljs-name">TargetFramework</span>></span>netcoreapp2.1<span class="hljs-tag"></<span class="hljs-name">TargetFramework</span>></span> <span class="hljs-tag"><<span class="hljs-name">RuntimeIdentifier</span>></span>win7-x64<span class="hljs-tag"></<span class="hljs-name">RuntimeIdentifier</span>></span> <span class="hljs-tag"></<span class="hljs-name">PropertyGroup</span>></span> |
要发布多个 RID: 通过以分号分隔的列表提供 RID。 使用属性名称 <RuntimeIdentifiers>(复数)。 有关详细信息,请参阅 .NET Core RID 目录。 为 Microsoft.AspNetCore.Hosting.WindowsServices 添加包引用。 在 Program.Main 中,进行下列更改: 调用 host.RunAsService,而不是 host.Run。 调用 UseContentRoot 并使用应用的发布位置路径,而不是 Directory.GetCurrentDirectory()。 C#复制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Main</span>(<span class="hljs-params"><span class="hljs-keyword">string</span>[] args</span>) </span>{ CreateWebHostBuilder(args).Build().RunAsService(); } <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> IWebHostBuilder <span class="hljs-title">CreateWebHostBuilder</span>(<span class="hljs-params"><span class="hljs-keyword">string</span>[] args</span>) </span>{ <span class="line-highlight"> <span class="hljs-keyword">var</span> pathToExe = Process.GetCurrentProcess().MainModule.FileName;</span> <span class="line-highlight"> <span class="hljs-keyword">var</span> pathToContentRoot = Path.GetDirectoryName(pathToExe);</span> <span class="hljs-keyword">return</span> WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, config) => { <span class="hljs-comment">// Configure the app here.</span> }) <span class="line-highlight"> .UseContentRoot(pathToContentRoot)</span> .UseStartup<Startup>(); } |
发布应用。 使用 dotnet publish 或 Visual Studio 发布配置文件。 使用 Visual Studio 时,请选择 FolderProfile。 要使用命令行接口 (CLI) 工具发布示例应用,请在项目文件夹的命令提示符处运行 dotnet publish 命令。 必须在项目文件的 <RuntimeIdenfifier>(或 <RuntimeIdentifiers>)属性中指定 RID。 在以下示例中,应用在 win7-x64 运行时的发布配置中发布: console复制
1 2 |
dotnet publish --configuration Release --runtime win7-x64 |
使用 sc.exe 命令行工具创建服务。 binPath 值是应用的可执行文件的路径,其中包括可执行文件的文件名。 等于号和路径开头的引号字符之间需要添加空格。 console复制
1 2 |
sc create <SERVICE_NAME> binPath= "<PATH_TO_SERVICE_EXECUTABLE>" |
对于项目文件夹中发布的服务,请使用 publish 文件夹的路径创建服务。 如下示例中: 该项目位于 c:\my_services\AspNetCoreService 文件夹中。 项目在 Release 配置中发布。 目标框架名字对象 (TFM) 为 netcoreapp2.1。 运行时标识符 (RID) 为 win7-x64。 应用可执行文件名为 AspNetCoreService.exe。 服务名为 MyService。 示例: console复制
1 2 |
sc create MyService binPath= "c:\my_services\AspNetCoreService\bin\Release\netcoreapp2.1\win7-x64\publish\AspNetCoreService.exe" |
重要 确保 binPath= 参数与其值之间存在空格。 从其他文件夹发布和启动服务: 使用 dotnet publish 命令上的 --output <OUTPUT_DIRECTORY> 选项。 如果使用 Visual Studio,请在“FolderProfile”发布属性页面中配置“目标位置”,然后再选择“发布”按钮。 通过使用输出文件夹路径的 sc.exe 命令创建服务。 在向 binPath 提供的路径中包含服务可执行文件的名称。 使用 sc […]
View Details