以Windows服务方式运行ASP.NET Core程序

原作者blog: https://www.cnblogs.com/guogangj/p/9198031.htmlaspnet的blog 需要持续不断的学习

我们对ASP.NET Core的使用已经进行了相当一段时间了,大多数时候,我们的Web程序都是发布到Linux主机上的,当然了,偶尔也有需求要发布到Windows主机上,这样问题就来了,难道直接以控制台形式运行这个Web程序吗?

直接以控制台形式运行程序当然是可以的,但有以下问题:

  1. 需要敲命令行(这个可以通过制作一个快捷方式解决)
  2. 用户也许会说有一个“黑黑的DOS窗口”,很奇怪
  3. 用户可能会随手把这个“黑黑的DOS窗口”关掉导致程序结束
  4. 不能够自动地随系统启动,得用户登录后再跑程序

如果我们把程序以Windows服务的方式来运行,那以上这些问题都没有了。

微软官方有篇文章,关于如何做这个事情的:https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-2.1

我也主要是参考了这篇文章,但其中还有些小小的坑,本文将会提到。OK,Let's get down to work.

包与生成目标

生成目标当然选择最新的.NET Core 2.1了,包则需要引入Microsoft.AspNetCore.Hosting.WindowsServices,最新版是2.1.1(2018/6/19更新,不就是今天嘛),如果你尝试使用最新的2.1.1版,那会出问题,报依赖冲突,你根据报错内容把ASP.NET 2.1.0升级到ASP.NET 2.1.1去,但依旧会出现问题:

It was not possible to find any compatible framework version
The specified framework 'Microsoft.AspNetCore.All', version '2.1.1' was not found.

看来需要安装新的SDK才行,但微软官网最新的正式版SDK就是2.1.300啊,这个还是等等吧,好,果断把版本降回2.1.0,这回没问题了。

修改Main入口

简单,非常简单,把Run改为RunAsService即可。

但这样会导致新的问题,你在开发过程中调试程序的时候会出现这样的错误:Cannot start service from the command line or a debugger. A Windows Service must first be installed and then started with the ServerExplorer, Windows Services Administrative tool or the NET START command. 程序跑不起来,意思显而易见,所以我们在调试中还是要以普通的Run方式。所以改成这样:

    IWebHost host = WebHost.CreateDefaultBuilder(args)
        .UseKestrel(options => { options.Listen(IPAddress.Any, 5201); }) //5201是我用的端口,你改成自己的
        .UseStartup<Startup>() //使用Startup配置类
        .Build();
    bool isService = !(Debugger.IsAttached || args.Contains("--console")); //Debug状态或者程序参数中带有--console都表示普通运行方式而不是Windows服务运行方式
    if (isService) {
        host.RunAsService();
    }
    else {
        host.Run();
    }

配置服务

ASP.NET Core publish生成的目标中并不包含exe文件,所以按照官网文档去弄的话可能会卡住,这是正确的姿势:

sc create MyService binPath= "\"C:\program files\dotnet\dotnet.exe\" \"D:\Services\MyService.dll\"" DisplayName= "MyService" start= auto

注意1:必须以管理员身份运行上面命令
注意2:binPath参数、DisplayName参数及start参数的等号后面必须带一个空格(官网文档也特别提起了这点)

启动服务:

sc run MyService

停止服务:

sc stop MyService

卸载服务:

sc delete MyService

其它

默认情况下,Windows系统服务是以system用户身份运行的,如果你需要切换身份运行,可以在“控制面板 - 管理工具 - 服务”中找到MyService,打开属性面板,在“登录”Tab中指定特定身份。

[转帖]以Windows服务方式运行ASP.NET Core程序的更多相关文章

  1. 以Windows服务方式运行ASP.NET Core程序

    我们对ASP.NET Core的使用已经进行了相当一段时间了,大多数时候,我们的Web程序都是发布到Linux主机上的,当然了,偶尔也有需求要发布到Windows主机上,这样问题就来了,难道直接以控制 ...

  2. 以Windows服务方式运行ASP.NET Core程序【转载】

    我们对ASP.NET Core的使用已经进行了相当一段时间了,大多数时候,我们的Web程序都是发布到Linux主机上的,当然了,偶尔也有需求要发布到Windows主机上,这样问题就来了,难道直接以控制 ...

  3. [转帖]以Windows服务方式运行.NET Core程序

    以Windows服务方式运行.NET Core程序 原作者blog:https://www.cnblogs.com/guogangj/p/10093102.html 里面使用了NSSM 工具 但是自己 ...

  4. 如何优雅的利用Windows服务来部署ASP.NET Core程序

    上一篇文章中我给大家讲述了五种部署ASP.NET Core网站的方法,其中有一种方式是通过Windows服务来进行部署,这样既可以做到开启自启动,又不会因为iis的反向代理而损失部分性能.但是美中不足 ...

  5. 连表查询都用Left Join吧 以Windows服务方式运行.NET Core程序 HTTP和HTTPS的区别 ASP.NET SignalR介绍 asp.net—WebApi跨域 asp.net—自定义轻量级ORM C#之23中设计模式

    连表查询都用Left Join吧   最近看同事的代码,SQL连表查询的时候很多时候用的是Inner Join,而我觉得对我们的业务而言,99.9%都应该使用Left Join(还有0.1%我不知道在 ...

  6. 以Windows服务方式运行.NET Core程序

    在之前一篇博客<以Windows服务方式运行ASP.NET Core程序>中我讲述了如何把ASP.NET Core程序作为Windows服务运行的方法,而今,我们又遇到了新的问题,那就是: ...

  7. 在Linux上以服务的方式运行ASP.NET Core站点

    更新:用supervisor是更好的解决方法,详见 Linux下为 dotnet 创建守护进程 要在生成环境下在Linux服务器上跑ASP.NET Core站点,首先要解决的问题是以服务的方式运行AS ...

  8. windows 服务中托管asp.net core

    在windows 服务中托管asp.net core SDK 2.1.300 官方示例 1.添加运行标识符 xml <PropertyGroup> <TargetFramework& ...

  9. MongoDB 3.4 安装以 Windows 服务方式运行

    1.首先从https://www.mongodb.com/download-center#community 下载社区版,企业版也是类似. 2.双击运行安装,可自定义安装路径,这里采用默认路径(C:\ ...

随机推荐

  1. 在php中分别使用curl的post提交数据的方法和get获取网页数据的方法

    在php中分别使用curl的post提交数据的方法和get获取网页数据的方法整理分享一下额,具体代码如下: (1)使用php curl获取网页数据的方法: $ch=curl_init(); //设置选 ...

  2. 【Codeforces 3D】Least Cost Bracket Sequence

    Codeforces 3 D 题意:有一个括号序列,其中一些位置是问号,把第\(i\)个问号改成(需要\(a_i\)的代价,把它改成)需要\(b_i\)的代价. 问使得这个括号序列成立所需要的最小代价 ...

  3. treap学习笔记

    treap是个很神奇的数据结构. 给你一个问题,你可以解决它吗? 这个问题需要treap这个数据结构. 众所周知,二叉查找树的查找效率低的原因是不平衡,而我们又不希望用各种奇奇怪怪的旋转来使它平衡,那 ...

  4. JavaScript设计模式 - 订阅发布模式(观察者模式)

    var Event = (function() { var global = this, Event, _default = 'default'; Event = function() { var _ ...

  5. xrange 和range的区别

    >>> xrange(5)xrange(5)>>> list(xrange(5))[0, 1, 2, 3, 4]>>> xrange(1,5)xr ...

  6. 图像YUV格式介绍

    图像YUV格式介绍   1 YUV格式简介 YUV格式,与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样 ...

  7. LOJ2537 PKUWC2018 Minimax 树形DP、线段树合并

    传送门 题意:自己去看 首先可以知道,每一个点都有几率被选到,所以$i$与$V_i$的关系是确定了的. 所以我们只需要考虑每一个值的取到的概率. 很容易设计出一个$DP$:设$f_{i,j}$为在第$ ...

  8. 微信小程序 wx.getUserInfo 解密 C# 代码 - 转

    public static string DecodeUserInfo(string raw, string signature,string encryptedData, string iv) { ...

  9. [Python]Python 函数调用小例子

    函数定义: In [78]: def printme(str): ....: print str ....: return ....: 调用: In [79]: printme('This is Ji ...

  10. TCP服务端开发为例--web开发不同url请求为何会走不同方法

    拿java的web开发为例子,相信有很多小伙伴是做j2EE开发的,htpp请求,json数据传输都是工作中经常用的,查询请求,添加请求,修改请求前端配个url,例如https://localhost/ ...