Windows 上快速部署.NET Core Web 项目

发布于:2024-12-18 ⋅ 阅读:(126) ⋅ 点赞:(0)

一、为什么在 Windows 上部署

在企业环境中,可能已经存在大量基于 Windows 的服务器和服务。如果你的.NET Core 项目需要与这些现有基础设施进行紧密集成,例如与 Active Directory 进行身份验证、使用 Windows 特定的文件共享或数据库连接,那么在 Windows 上部署可以更加方便地实现这些集成。另外有些特定软件的依赖只有Windows版本,比如某些工业软件服务,很多只有Windows版本。

二、Kestrel 服务器的高性能

  • Kestrel 是.NET Core 自带的跨平台 Web 服务器,它具有以下高性能特性:
  1. 轻量级和高效
    • Kestrel 是一个轻量级的服务器,它的内存占用和启动时间都非常小。这使得它非常适合在资源受限的环境中运行,同时也能够快速启动和响应请求。
    • 与传统的 Web 服务器相比,Kestrel 不需要大量的配置和依赖项,因此可以更快地部署和启动。
  1. 异步和非阻塞
    • Kestrel 采用异步和非阻塞的编程模型,能够有效地处理大量的并发请求。它可以在不阻塞线程的情况下处理多个请求,从而提高服务器的吞吐量和响应速度。
    • 这种异步编程模型还可以减少服务器的资源消耗,因为它不需要为每个请求创建一个新的线程。
  1. 支持 HTTP/2
    • Kestrel 支持 HTTP/2 协议,这是一种新一代的 Web 协议,具有更高的性能和更好的安全性。HTTP/2 可以在单个连接上同时处理多个请求和响应,减少了延迟和网络开销。
    • 启用 HTTP/2 可以提高网站的加载速度和用户体验,特别是对于需要加载大量资源的网站。
  1. 易于配置和扩展
    • Kestrel 可以通过配置文件进行轻松配置,并且可以与其他.NET Core 中间件和组件进行集成。这使得开发人员可以根据自己的需求定制服务器的行为,并添加额外的功能和安全性。
    • 例如,可以使用中间件来实现日志记录、身份验证、授权和缓存等功能。

三、将.NET Core 项目作为 Windows 服务

可以直接使用windows的sc命令来创建服务,但是会经常出现问题,目前常见的工具有WinSW和NSSM工具。

(一)WinSW 的优势

  1. 简单易用
    • WinSW 的配置相对简单,只需要一个 XML 配置文件即可完成服务的配置。对于不熟悉复杂工具的用户来说,WinSW 更容易上手。
    • 配置文件的格式清晰明了,易于理解和修改。用户可以快速根据自己的需求进行配置,而不需要花费大量时间学习复杂的工具界面和参数。
  1. 轻量级
    • WinSW 本身是一个轻量级的工具,不会占用过多的系统资源。这对于资源有限的服务器环境来说非常重要,可以确保服务的稳定运行,同时不会对系统性能造成过大的影响。
  1. 开源免费
    • WinSW 是开源软件,用户可以免费使用。这对于个人开发者和小型团队来说是一个很大的优势,可以降低项目的成本。

(二)NSSM 的特点

  1. 功能丰富
    • NSSM 提供了更多的功能选项,例如可以设置服务的依赖关系、启动参数、环境变量等。对于需要更复杂配置的用户来说,NSSM 可能更适合。
    • NSSM 还支持图形用户界面,用户可以通过直观的界面进行配置,而不需要手动编辑配置文件。
  1. 广泛的社区支持
    • NSSM 拥有广泛的社区支持,用户可以在网上找到大量的教程和解决方案。如果在使用过程中遇到问题,更容易获得帮助。

(三)选择 WinSW 的原因

  1. 满足需求
    • 对于大多数将.NET Core 项目作为 Windows 服务的场景,WinSW 的简单易用和轻量级特性已经能够满足需求。如果没有特殊的复杂配置要求,WinSW 是一个更快速、高效的选择。
  1. 降低复杂性
    • 在一些情况下,过于复杂的工具可能会引入不必要的复杂性和风险。WinSW 的简洁性可以减少配置错误的可能性,提高服务的稳定性和可靠性。
  1. 成本考虑
    • 对于个人开发者和小型团队来说,开源免费的 WinSW 可以降低项目的成本。而对于大型企业或有特殊需求的用户,可以根据实际情况选择 NSSM 或其他更复杂的工具。

四、使用 WinSW 将.NET Core 项目作为 Windows 服务

  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>  
<log mode=""></log>
</service>

在这个配置文件中,你需要将“id”、“name”和“description”替换为你的服务的唯一标识符、名称和描述。“executable”指定了用于启动服务的可执行文件,“logmode”指定了日志记录模式,可以是“roll”(滚动日志)或“append”(追加日志)。

  1. 安装和启动服务
    • 将配置文件和 WinSW 可执行文件放在同一目录下。
    • 打开以管理员启动命令提示符,并切换到包含配置文件和 WinSW 可执行文件的目录。
    • 运行以下命令安装服务:
MyAppService.exe install

这将安装服务,并将其注册到 Windows 服务控制管理器中。

  • 运行以下命令启动服务:
MyAppService.exe start

这将启动服务,并在后台运行你的.NET Core 项目。

  1. 管理服务
    • 可以使用 Windows 服务控制管理器来管理你的服务。打开“服务”窗口(可以在“控制面板”->“管理工具”->“服务”中找到),找到你的服务,并可以进行启动、停止、暂停、恢复等操作。
    • 还可以使用命令提示符来管理服务。例如,运行以下命令停止服务:
MyAppService.exe stop

常用命令如下:

命令 描述
install 安装服务
uninstall 卸载服务
start 启动服务
stop 停止服务
restart 重启服务
status 检查服务状态
refresh 刷新服务属性而不是重新安装

五、案例

  1. 创建一个简单的最小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();
        }
    }
    

    生成如下文件

    image-20241203164522588

  2. WinSW.exe拷贝到项目目录,并且新建一个xml文件,文件名必须与之相同,xml文件配置如下:

<service>
  <id>netcoreTest</id>
  <name>netcoreTest</name>
  <description>测试.net部署</description>
  <executable>%BASE%\WebApplication2.exe</executable>
</service>

最终的目录文件列表如下:

image-20241203164759704

  1. 以管理员cmd运行WinSW.exe start,此时在任务管理器中可以看到服务已经运行:

image-20241203165138971

  1. 在浏览器访问http://localhost:6642/hello,出现如下页面

image-20241203165233893


网站公告

今日签到

点亮在社区的每一天
去签到