ASP.NET Core使用TopShelf部署Windows服務

来源:https://www.cnblogs.com/podolski/archive/2018/12/02/10054286.html
-Advertisement-
Play Games

asp.net core很大的方便了跨平臺的開發者,linux的開發者可以使用apache和nginx來做反向代理,windows上可以用IIS進行反向代理。 反向代理可以提供很多特性,固然很好。但是還有複雜性,我們也可以使用windows service來直接啟動kestrel。 asp.net ...


asp.net core很大的方便了跨平臺的開發者,linux的開發者可以使用apache和nginx來做反向代理,windows上可以用IIS進行反向代理。
反向代理可以提供很多特性,固然很好。但是還有複雜性,我們也可以使用windows service來直接啟動kestrel。

asp.net core官方網站提供了一種基於windows服務部署的方法:在 Windows 服務中托管 ASP.NET Core
這種方式需要修改代碼,然後部署的時候,使用命令行創建、安裝服務,然後再啟動。

感覺還是不夠爽快,我們可以使用topshelf改造一下。

TopShelf

topshelf可以很便捷地將一個windows console程式改造成windows service,只需要稍微修改一下代碼結構,然後通過nuget包就可以簡單操作了。安裝與部署也是極其方便,而且,topshelf在調試的時候,直接是作為console程式,極其便於調試。

TopShelf項目地址:http://topshelf-project.com/

步驟

首先引用nuget包:

Install-Package TopShelf

然後改造一下program.cs

public class Program
{
    public static void Main(string[] args)
    {
        var rc = HostFactory.Run(x =>                                   //1
        {
            x.Service<MainService>(s =>                                   //2
            {
                s.ConstructUsing(name => new MainService(args));                //3
                s.WhenStarted(tc => tc.Start());                         //4
                s.WhenStopped(tc => tc.Stop());                          //5
            });
            x.RunAsLocalSystem();                                       //6

            x.SetDescription("JwtAPIService");                   //7
            x.SetDisplayName("JwtAPIService");                                  //8
            x.SetServiceName("JwtAPIService");                                  //9
        });                                                             //10

        var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());  //11
        Environment.ExitCode = exitCode;

        //CreateWebHostBuilder(args).Build().RunAsService();
    }
}

這裡指定服務程式的內容在MainService這個類裡面,並通過代碼指定了服務的名稱和描述等行為。以前的啟動CreateWebHostBuilder方法轉移到了這個類中:

public class MainService
{
    private string[] args;
    public MainService(string[] vs)
    {
        args = vs;
    }
    public void Start()
    {
        var isService = !(Debugger.IsAttached || args.Contains("--console"));
        var builder = CreateWebHostBuilder(args.Where(arg => arg != "--console").ToArray());

        if (isService)
        {
            var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
            var pathToContentRoot = Path.GetDirectoryName(pathToExe);
            builder.UseContentRoot(pathToContentRoot);
        }

        var host = builder.Build();
        host.Run();
    }

    public void Stop()
    {
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args)
    {
        var config = new ConfigurationBuilder()
// .SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("config.json", optional: true, reloadOnChange: true)
.Build();

        return WebHost.CreateDefaultBuilder(args)
                .UseKestrel()
                .UseConfiguration(config)
                .UseStartup<Startup>();
    }
}

Start方法指定服務啟動時,服務的執行不需要依賴於Microsoft.AspNetCore.Hosting.WindowsServices這個nuget包。
另外Contentroot需要註意,使用windows服務進行提供服務,GetCurrentDirectory的根目錄是system32,而不是asp.net core的dll的目錄。使用appsettings.json時,可能會引起問題,最好使用自定義的程式配置(例如這裡通過config.json進行設置)。

運行

  • 確定是否存在 Windows 運行時標識符 (RID),或將其添加到包含目標框架的 中:
<PropertyGroup>
   <TargetFramework>netcoreapp2.1</TargetFramework>
   <RuntimeIdentifier>win7-x64</RuntimeIdentifier>
</PropertyGroup>
  • 發佈,最終可以得到可執行程式。直接雙擊運行,程式就可以以console的形式啟動,方便調試。
  • 命令行運行xxxx.exe install就而可以安裝服務,然後服務就可以自動啟動。
  • 命令行運行xxxx.exe uninstall就可以卸載服務。整個過程不需要新建用戶與策略。

後記

吐槽:直接使用TopShelf,調試windows服務的過程變得不那麼痛苦了,想起附加調試器的過程,簡直了。
P.S. 需要最新版本的topshelf才可以支持asp.net core的服務部署。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • random 模塊 隨機:在某個範圍內取到每一個值的概率是相同的 練習:生成隨機驗證碼 # (1)4位數字的驗證碼 # 基礎版本 lis = '' for i in range(4): num = random.randint(0, 9) lis += str(num) print(lis) # 函 ...
  • 1.什麼是生成器 通過列表生成式,我們可以直接創建一個列表。但是,受到記憶體限制,列表容量肯定是有限的。而且,創建一個包含100萬個元素的列表,不僅占用很大的存儲空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。所以生成器就出現了,他彌補了直接生成大列表的不足,改成為定 ...
  • 案例 將一個 pdf 文件按要求分割為幾個部分。比如說一個pdf有20頁,分成5個pdf文件,每個pdf文件包含4頁。設計函數實現? Python代碼 函數講解 本函數是自己測試通過的函數,還有待優化。輸入參數有,將要分割的PDF文件,分割為幾個pdf文件,每個PDF文件頁數。 測試結果 原來只有一 ...
  • spring Aop的配置一定要配置在springmvc配置文件中 springMVC.xml1 <!-- AOP 註解方式 ;定義Aspect --> 2 <!-- 激活組件掃描功能,在包com.ly.aop.aspect及其子包下麵自動掃描通過註解配置的組件--> 3 <context:comp ...
  • 前言 領域驅動設計,其實已經是一個很古老的概念了,但它的複雜度依舊讓學習的人頭疼不已。 互聯網關於領域驅動的文章有很多,每一篇寫的都很好,理解領域驅動設計的人都看的懂。 不過,這些文章對於那些初學者而言,還是如同天書一樣。 買本驅動領域的書來看?別逗了,這可不是C#語法入門,哪裡有書能寫明白的。 想 ...
  • Nuget( "BagGet" )使用教程 1. 伺服器安裝ASP.NET Core 網上有很多教程,不多講,鏈接給你: "https://www.cnblogs.com/Agui520/p/8331499.html" 只需要安裝SDK和Runtime即可。安裝成功在命令視窗界面輸入命令“dotne ...
  • 寫在前面 這篇我們對用戶許可權進行極簡設計並保留其擴展性。首先很感謝大家的閱讀,前面六章我帶著大家快速入門了ASP.NET Core、ASP.NET Core的啟動過程源碼解析及配置文件的載入過程源碼解析並引入依賴註入的概念、Git的快速入門、Dapper的快速入門、Vue的快速入門。不知道大伙掌握的 ...
  • 我需要把資料庫中查詢出的數據,傳遞到另一個控制器的頁面去顯示。 https://blog.csdn.net/ma_jiang/article/details/8164212 看了上面這篇文章,反應過來用TempData傳遞。。反正只是顯示一下,不用存在多久。。很好用! ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...