在 Windows 服务中托管 ASP.NET Core

不将 IIS 用作 Windows 服务时,可在 Windows 上托管 ASP.NET Core 应用。 作为 Windows 服务托管时,无需人工干预应用即可在重新启动和崩溃后自动启动。

查看或下载示例代码如何下载

将项目转换为 Windows 服务

要将现有 ASP.NET Core 项目设置为作为服务运行,至少需要执行以下更改:

  1. 在项目文件中:
    • 确认是否存在 Windows 运行时标识符 (RID),或将其添加到包含目标框架的 <PropertyGroup> 中:
      XML

      要发布多个 RID:

      • 通过以分号分隔的列表提供 RID。
      • 使用属性名称 <RuntimeIdentifiers>(复数)。

      有关详细信息,请参阅 .NET Core RID 目录

    • 为 Microsoft.AspNetCore.Hosting.WindowsServices 添加包引用。
  2. 在 Program.Main 中,进行下列更改:
    • 调用 host.RunAsService,而不是 host.Run
    • 调用 UseContentRoot 并使用应用的发布位置路径,而不是 Directory.GetCurrentDirectory()
      C#

  3. 发布应用。 使用 dotnet publish 或 Visual Studio 发布配置文件 使用 Visual Studio 时,请选择 FolderProfile。

    要使用命令行接口 (CLI) 工具发布示例应用,请在项目文件夹的命令提示符处运行 dotnet publish 命令。 必须在项目文件的 <RuntimeIdenfifier>(或 <RuntimeIdentifiers>)属性中指定 RID。 在以下示例中,应用在 win7-x64 运行时的发布配置中发布:

    console

  4. 使用 sc.exe 命令行工具创建服务。 binPath 值是应用的可执行文件的路径,其中包括可执行文件的文件名。 等于号和路径开头的引号字符之间需要添加空格。
    console

    对于项目文件夹中发布的服务,请使用 publish 文件夹的路径创建服务。 如下示例中:

    • 该项目位于 c:\my_services\AspNetCoreService 文件夹中。
    • 项目在 Release 配置中发布。
    • 目标框架名字对象 (TFM) 为 netcoreapp2.1
    • 运行时标识符 (RID) 为 win7-x64
    • 应用可执行文件名为 AspNetCoreService.exe。
    • 服务名为 MyService。

    示例:

    console

    重要

    确保 binPath= 参数与其值之间存在空格。

    从其他文件夹发布和启动服务:

    • 使用 dotnet publish 命令上的 –output <OUTPUT_DIRECTORY> 选项。 如果使用 Visual Studio,请在“FolderProfile”发布属性页面中配置“目标位置”,然后再选择“发布”按钮。
    • 通过使用输出文件夹路径的 sc.exe 命令创建服务。 在向 binPath 提供的路径中包含服务可执行文件的名称。
  5. 使用 sc start <SERVICE_NAME> 命令启动服务。

    要启动示例应用服务,请使用以下命令:

    console

    此命令需要几秒钟才能启动服务。

  6. 要检查服务的状态,请使用 sc query <SERVICE_NAME> 命令。 状态报告为以下值之一:
    • START_PENDING
    • RUNNING
    • STOP_PENDING
    • STOPPED

    使用以下命令检查示例应用服务的状态:

    console

  7. 当服务处于 RUNNING 状态并且服务是 Web 应用时,在应用所在路径中浏览应用(默认路径为 http://localhost:5000;在使用 HTTPS 重定向中间件时,它将重定向到 https://localhost:5001)。

    对于示例应用服务,请在 http://localhost:5000 浏览应用。

  8. 使用 sc stop <SERVICE_NAME> 命令停止服务。

    以下命令可停止示例应用服务:

    console

  9. 停止服务并经过短暂延迟后,使用 sc delete <SERVICE_NAME> 命令卸载服务。

    检查示例应用服务的状态:

    console

    当示例应用服务处于 STOPPED 状态时,使用以下命令卸载示例应用服务:

    console

在服务之外运行应用

在服务之外运行时更便于进行测试和调试,因此通常仅在特定情况下添加调用 RunAsService 的代码。 例如,应用可以使用 --console 命令行参数或在已附加调试器时作为控制台应用运行:

C#

由于 ASP.NET Core 配置需要命令行参数的名称/值对,因此将先删除 --console 开关,然后再将参数传递到 CreateDefaultBuilder

备注

不将 Main 中的 isService 传递到 CreateWebHostBuilder,因为 CreateWebHostBuilder 的签名必须是 CreateWebHostBuilder(string[])才能使集成测试正常运行。

处理停止和启动事件

要处理 OnStartingOnStarted 和 OnStopping 事件,请执行以下额外更改:

  1. 创建从 WebHostService 派生的类:
    C#

  2. 创建可将自定义 WebHostService 传递给 ServiceBase.Run 的 IWebHost 的扩展方法:
    C#

  3. 在 Program.Main 中,调用新扩展方法 RunAsCustomService,而不是 RunAsService
    C#

    备注

    不将 Main 中的 isService 传递到 CreateWebHostBuilder,因为 CreateWebHostBuilder 的签名必须是 CreateWebHostBuilder(string[])才能使集成测试正常运行。

如果自定义 WebHostService 代码需要来自依赖项注入(如记录器)的服务,请从 IWebHost.Services 属性中获取:

C#

代理服务器和负载均衡器方案

与来自 Internet 或公司网络的请求进行交互且在代理或负载均衡器后方的服务可能需要其他配置。 有关更多信息,请参见配置 ASP.NET Core 以使用代理服务器和负载均衡器

配置 HTTPS

指定 Kestrel 服务器 HTTPS 终结点配置

当前目录和内容根

通过为 Windows 服务调用 Directory.GetCurrentDirectory() 返回的当前工作目录是 C:\WINDOWS\system32 文件夹。 system32 文件夹不是存储服务文件(如设置文件)的合适位置。 使用 IConfigurationBuilder 时,通过以下某种方法使用 FileConfigurationExtensions.SetBasePath 维护和访问服务的资产和设置文件:

  • 使用内容根路径。 IHostingEnvironment.ContentRootPath 是创建服务时提供给 binPath 参数的同一路径。 不要使用 Directory.GetCurrentDirectory() 创建设置文件的路径,而是使用内容根路径并在应用的内容根中维护文件。
  • 将文件存储在磁盘中的合适位置。 使用 SetBasePath 指定到包含文件的文件夹的绝对路径。

其他资源

 

from:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-2.1