一、为什么在 Windows 上部署二、Kestrel 服务器的高性能三、将.NET Core 项目作为 Windows 服务四、使用 WinSW 将.NET Core 项目作为 Windows 服务五、案例
一、为什么在 Windows 上部署
在企业环境中,可能已经存在大量基于 Windows 的服务器和服务。如果你的.NET Core 项目需要与这些现有基础设施进行紧密集成,例如与 Active Directory 进行身份验证、使用 Windows 特定的文件共享或数据库连接,那么在 Windows 上部署可以更加方便地实现这些集成。另外有些特定软件的依赖只有Windows版本,比如某些工业软件服务,很多只有Windows版本。
二、Kestrel 服务器的高性能
Kestrel 是.NET Core 自带的跨平台 Web 服务器,它具有以下高性能特性:
2.1 轻量级和高效
Kestrel 是一个轻量级的服务器,它的内存占用和启动时间都非常小。这使得它非常适合在资源受限的环境中运行,同时也能够快速启动和响应请求。
与传统的 Web 服务器相比,Kestrel 不需要大量的配置和依赖项,因此可以更快地部署和启动。
2.2 异步和非阻塞
Kestrel 采用异步和非阻塞的编程模型,能够有效地处理大量的并发请求。它可以在不阻塞线程的情况下处理多个请求,从而提高服务器的吞吐量和响应速度。
这种异步编程模型还可以减少服务器的资源消耗,因为它不需要为每个请求创建一个新的线程。
2.3 支持 HTTP/2
Kestrel 支持 HTTP/2 协议,这是一种新一代的 Web 协议,具有更高的性能和更好的安全性。HTTP/2 可以在单个连接上同时处理多个请求和响应,减少了延迟和网络开销。
启用 HTTP/2 可以提高网站的加载速度和用户体验,特别是对于需要加载大量资源的网站。
2.4 易于配置和扩展
Kestrel 可以通过配置文件进行轻松配置,并且可以与其他.NET Core 中间件和组件进行集成。这使得开发人员可以根据自己的需求定制服务器的行为,并添加额外的功能和安全性。
例如,可以使用中间件来实现日志记录、身份验证、授权和缓存等功能。
三、将.NET Core 项目作为 Windows 服务
可以直接使用windows的sc命令来创建服务,但是会经常出现问题,目前常见的工具有WinSW和NSSM工具。
3.1 WinSW 的优势
1、简单易用
WinSW 的配置相对简单,只需要一个 XML 配置文件即可完成服务的配置。对于不熟悉复杂工具的用户来说,WinSW 更容易上手。
配置文件的格式清晰明了,易于理解和修改。用户可以快速根据自己的需求进行配置,而不需要花费大量时间学习复杂的工具界面和参数。
2、轻量级
WinSW 本身是一个轻量级的工具,不会占用过多的系统资源。这对于资源有限的服务器环境来说非常重要,可以确保服务的稳定运行,同时不会对系统性能造成过大的影响。
3、开源免费
WinSW 是开源软件,用户可以免费使用。这对于个人开发者和小型团队来说是一个很大的优势,可以降低项目的成本。
3.2 NSSM 的特点
1、功能丰富
NSSM 提供了更多的功能选项,例如可以设置服务的依赖关系、启动参数、环境变量等。对于需要更复杂配置的用户来说,NSSM 可能更适合。
NSSM 还支持图形用户界面,用户可以通过直观的界面进行配置,而不需要手动编辑配置文件。
2、 广泛的社区支持
NSSM 拥有广泛的社区支持,用户可以在网上找到大量的教程和解决方案。如果在使用过程中遇到问题,更容易获得帮助。
3.3 选择 WinSW 的原因
1、 满足需求
对于大多数将.NET Core 项目作为 Windows 服务的场景,WinSW 的简单易用和轻量级特性已经能够满足需求。如果没有特殊的复杂配置要求,WinSW 是一个更快速、高效的选择。
2、 降低复杂性
在一些情况下,过于复杂的工具可能会引入不必要的复杂性和风险。WinSW 的简洁性可以减少配置错误的可能性,提高服务的稳定性和可靠性。
3、 成本考虑
对于个人开发者和小型团队来说,开源免费的 WinSW 可以降低项目的成本。而对于大型企业或有特殊需求的用户,可以根据实际情况选择 NSSM 或其他更复杂的工具。
四、使用 WinSW 将.NET Core 项目作为 Windows 服务
4.1 下载 WinSW
从 https://github.com/winsw/winsw/releases下载最新版本的 WinSW。WinSW 提供了多种版本,包括 32 位和 64 位版本。选择适合你的系统和需求的版本进行下载。
1、 配置 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>
<logmode=""></log>
</service>
在这个配置文件中,你需要将“id”、“name”和“description”替换为你的服务的唯一标识符、名称和描述。“executable”指定了用于启动服务的可执行文件,“logmode”指定了日志记录模式,可以是“roll”(滚动日志)或“append”(追加日志)。
2、安装和启动服务
将配置文件和 WinSW 可执行文件放在同一目录下。
打开以管理员启动命令提示符,并切换到包含配置文件和 WinSW 可执行文件的目录。
运行以下命令安装服务:
MyAppService.exe install
这将安装服务,并将其注册到 Windows 服务控制管理器中。
运行以下命令启动服务:
MyAppService.exe start
这将启动服务,并在后台运行你的.NET Core 项目。
3、 管理服务
可以使用 Windows 服务控制管理器来管理你的服务。打开“服务”窗口(可以在“控制面板”->“管理工具”->“服务”中找到),找到你的服务,并可以进行启动、停止、暂停、恢复等操作。
还可以使用命令提示符来管理服务。例如,运行以下命令停止服务:
MyAppService.exe stop
常用命令如下:
五、案例
- 创建一个简单的最小API项目,编译。
public class Program
{
public static void Main(string[] args)
{
var builder =WebApplication.CreateBuilder(args);
//配置使用Kestrel监听端口为6642builder.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,出现如下页面
个人观点,仅供参考
原创 步步为营Dotnet