zoukankan      html  css  js  c++  java
  • 以Windows服务方式运行ASP.NET Core程序

    我们对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 filesdotnetdotnet.exe" "D:ServicesMyService.dll"" DisplayName= "MyService" start= auto

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

    启动服务:

    sc run MyService

    停止服务:

    sc stop MyService

    卸载服务:

    sc delete MyService

    其它

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

    来源:http://www.cnblogs.com/guogangj/p/9198031.html

  • 相关阅读:
    StringBuffer和StringBuilder
    String类
    软件设计师考点总结(一)
    基于 Axis2的webService接口的基本开发步骤
    Linux学习Day10:LVM(逻辑卷管理器)
    Linux学习Day9:使用RAID(独立冗余磁盘阵列)
    Linux学习Day8:挂载硬盘设备、添加交换分区
    Linux学习Day7:用户身份与文件权限、su命令与sudo服务
    Linux学习Day6:编写Shell脚本、配置计划任务
    Linux学习Day5:Vim编辑器、配置网卡、配置Yum软件本地仓库
  • 原文地址:https://www.cnblogs.com/littlewrong/p/9577213.html
Copyright © 2011-2022 走看看