一、为什么在 Windows 上部署
在企业环境中,可能已经存在大量基于 Windows 的服务器和服务。如果你的.NET Core 项目需要与这些现有基础设施进行紧密集成,例如与 Active Directory 进行身份验证、使用 Windows 特定的文件共享或数据库连接,那么在 Windows 上部署可以更加方便地实现这些集成。另外有些特定软件的依赖只有Windows版本,比如某些工业软件服务,很多只有Windows版本。
二、Kestrel 服务器的高性能
- Kestrel 是.NET Core 自带的跨平台 Web 服务器,它具有以下高性能特性:
- 轻量级和高效
-
- Kestrel 是一个轻量级的服务器,它的内存占用和启动时间都非常小。这使得它非常适合在资源受限的环境中运行,同时也能够快速启动和响应请求。
-
- 与传统的 Web 服务器相比,Kestrel 不需要大量的配置和依赖项,因此可以更快地部署和启动。
- 异步和非阻塞
-
- Kestrel 采用异步和非阻塞的编程模型,能够有效地处理大量的并发请求。它可以在不阻塞线程的情况下处理多个请求,从而提高服务器的吞吐量和响应速度。
-
- 这种异步编程模型还可以减少服务器的资源消耗,因为它不需要为每个请求创建一个新的线程。
- 支持 HTTP/2
-
- Kestrel 支持 HTTP/2 协议,这是一种新一代的 Web 协议,具有更高的性能和更好的安全性。HTTP/2 可以在单个连接上同时处理多个请求和响应,减少了延迟和网络开销。
-
- 启用 HTTP/2 可以提高网站的加载速度和用户体验,特别是对于需要加载大量资源的网站。
- 易于配置和扩展
-
- Kestrel 可以通过配置文件进行轻松配置,并且可以与其他.NET Core 中间件和组件进行集成。这使得开发人员可以根据自己的需求定制服务器的行为,并添加额外的功能和安全性。
-
- 例如,可以使用中间件来实现日志记录、身份验证、授权和缓存等功能。
三、将.NET Core 项目作为 Windows 服务
可以直接使用windows的sc
命令来创建服务,但是会经常出现问题,目前常见的工具有WinSW和NSSM工具。
(一)WinSW 的优势
- 简单易用
-
- WinSW 的配置相对简单,只需要一个 XML 配置文件即可完成服务的配置。对于不熟悉复杂工具的用户来说,WinSW 更容易上手。
-
- 配置文件的格式清晰明了,易于理解和修改。用户可以快速根据自己的需求进行配置,而不需要花费大量时间学习复杂的工具界面和参数。
- 轻量级
-
- WinSW 本身是一个轻量级的工具,不会占用过多的系统资源。这对于资源有限的服务器环境来说非常重要,可以确保服务的稳定运行,同时不会对系统性能造成过大的影响。
- 开源免费
-
- WinSW 是开源软件,用户可以免费使用。这对于个人开发者和小型团队来说是一个很大的优势,可以降低项目的成本。
(二)NSSM 的特点
- 功能丰富
-
- NSSM 提供了更多的功能选项,例如可以设置服务的依赖关系、启动参数、环境变量等。对于需要更复杂配置的用户来说,NSSM 可能更适合。
-
- NSSM 还支持图形用户界面,用户可以通过直观的界面进行配置,而不需要手动编辑配置文件。
- 广泛的社区支持
-
- NSSM 拥有广泛的社区支持,用户可以在网上找到大量的教程和解决方案。如果在使用过程中遇到问题,更容易获得帮助。
(三)选择 WinSW 的原因
- 满足需求
-
- 对于大多数将.NET Core 项目作为 Windows 服务的场景,WinSW 的简单易用和轻量级特性已经能够满足需求。如果没有特殊的复杂配置要求,WinSW 是一个更快速、高效的选择。
- 降低复杂性
-
- 在一些情况下,过于复杂的工具可能会引入不必要的复杂性和风险。WinSW 的简洁性可以减少配置错误的可能性,提高服务的稳定性和可靠性。
- 成本考虑
-
- 对于个人开发者和小型团队来说,开源免费的 WinSW 可以降低项目的成本。而对于大型企业或有特殊需求的用户,可以根据实际情况选择 NSSM 或其他更复杂的工具。
四、使用 WinSW 将.NET Core 项目作为 Windows 服务
- 下载 WinSW
-
- 从
https://github.com/winsw/winsw/releases
下载最新版本的 WinSW。WinSW 提供了多种版本,包括 32 位和 64 位版本。选择适合你的系统和需求的版本进行下载。
- 从
- 配置 WinSW
-
- 将下载的 WinSW 可执行文件重命名为与你的.NET Core 项目名称相关的名称,例如“MyAppService.exe”。
-
- 创建一个 XML 配置文件,文件名一定要和上一步的WinSW名称相同,用于配置 WinSW。以下是一个示例配置文件:
<service>
--设置服务id
<id>myapp</id>
--设置服务名称 一般和id一样
<name>MyApp Service (powered by WinSW)</name>
--类似于服务说明、备注>
<description>This service is a service created from a sample configuration</description>
--这里输入软件的路径
<executable>%BASE%\myExecutable.exe</executable>
--设置优先事项
<priority></priority>
--stoptimeout:停止超时时间,默认“15 sec”
<stoptimeout>15 sec</stoptimeout>
--是否在停止子进程之前终止父进程,默认true
<stopparentprocessfirst>true</stopparentprocessfirst>
--Boot:设备驱动程序由操作系统加载程序启动。此值仅对驱动程序服务有效。
--System:设备驱动程序由操作系统初始化过程启动。此值仅对驱动程序服务有效。
--Automatic:自动,服务控制管理器将在系统启动期间自动启动服务。
--Manual:手动,当进程调用StartService方法时,由服务控制管理器启动的服务。
--Disabled:禁用,无法再启动的服务。
--默认值为Automatic
<startmode>Automatic</startmode>
--指定多长时间内服务应该对SetServiceStatus函数进行下一次调用,否则会被标记为无响应,默认“15 sec”
<waithint>15 sec</waithint>
--服务两次调用SetServiceStatus函数的间隔时间,默认“1 sec”
<sleeptime>1 sec</sleeptime>
<log mode=""></log>
</service>
在这个配置文件中,你需要将“id”、“name”和“description”替换为你的服务的唯一标识符、名称和描述。“executable”指定了用于启动服务的可执行文件,“logmode”指定了日志记录模式,可以是“roll”(滚动日志)或“append”(追加日志)。
- 安装和启动服务
-
- 将配置文件和 WinSW 可执行文件放在同一目录下。
-
- 打开以管理员启动命令提示符,并切换到包含配置文件和 WinSW 可执行文件的目录。
-
- 运行以下命令安装服务:
MyAppService.exe install
这将安装服务,并将其注册到 Windows 服务控制管理器中。
- 运行以下命令启动服务:
MyAppService.exe start
这将启动服务,并在后台运行你的.NET Core 项目。
- 管理服务
-
- 可以使用 Windows 服务控制管理器来管理你的服务。打开“服务”窗口(可以在“控制面板”->“管理工具”->“服务”中找到),找到你的服务,并可以进行启动、停止、暂停、恢复等操作。
-
- 还可以使用命令提示符来管理服务。例如,运行以下命令停止服务:
MyAppService.exe stop
常用命令如下:
命令 | 描述 |
---|---|
install | 安装服务 |
uninstall | 卸载服务 |
start | 启动服务 |
stop | 停止服务 |
restart | 重启服务 |
status | 检查服务状态 |
refresh | 刷新服务属性而不是重新安装 |
五、案例
创建一个简单的最小API项目,编译。
public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); //配置使用Kestrel监听端口为6642 builder.WebHost.ConfigureKestrel(options => { options.ListenLocalhost(6642); }); var app = builder.Build(); app.MapGet("/hello", () => "hello world~~~~"); app.Run(); } }
生成如下文件
将
WinSW.exe
拷贝到项目目录,并且新建一个xml文件,文件名必须与之相同,xml文件配置如下:
<service>
<id>netcoreTest</id>
<name>netcoreTest</name>
<description>测试.net部署</description>
<executable>%BASE%\WebApplication2.exe</executable>
</service>
最终的目录文件列表如下:
- 以管理员cmd运行
WinSW.exe start
,此时在任务管理器中可以看到服务已经运行:
- 在浏览器访问
http://localhost:6642/hello
,出现如下页面