<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ASP.NET Core使用TopShelf部署Windows服務(wù)

          共 3288字,需瀏覽 7分鐘

           ·

          2020-11-02 02:19

          asp.net core很大的方便了跨平臺的開發(fā)者,linux的開發(fā)者可以使用apache和nginx來做反向代理,windows上可以用IIS進(jìn)行反向代理。


          反向代理可以提供很多特性,固然很好。但是還有復(fù)雜性,我們也可以使用windows service來直接啟動kestrel。


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

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


          TopShelf

          topshelf可以很便捷地將一個windows console程序改造成windows service,只需要稍微修改一下代碼結(jié)構(gòu),然后通過nuget包就可以簡單操作了。安裝與部署也是極其方便,而且,topshelf在調(diào)試的時候,直接是作為console程序,極其便于調(diào)試。


          TopShelf項(xiàng)目地址:

          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(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(); }}


          這里指定服務(wù)程序的內(nèi)容在MainService這個類里面,并通過代碼指定了服務(wù)的名稱和描述等行為。以前的啟動CreateWebHostBuilder方法轉(zhuǎn)移到了這個類中:


          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(); }}
          • Start方法指定服務(wù)啟動時,服務(wù)的執(zhí)行不需要依賴于Microsoft.AspNetCore.Hosting.WindowsServices這個nuget包。

          • 另外Contentroot需要注意,使用windows服務(wù)進(jìn)行提供服務(wù),GetCurrentDirectory的根目錄是system32,而不是asp.net core的dll的目錄。使用appsettings.json時,可能會引起問題,最好使用自定義的程序配置(例如這里通過config.json進(jìn)行設(shè)置)。

          • 注意和調(diào)試的時候不同,launchsettings.json在正式運(yùn)行的時候是不可用的,請通過編碼(比如UseUrls)來設(shè)置監(jiān)聽端口。

          運(yùn)行

          • 確定是否存在 Windows 運(yùn)行時標(biāo)識符 (RID),或?qū)⑵涮砑拥桨繕?biāo)框架的?

            中:
          <PropertyGroup><TargetFramework>netcoreapp2.1TargetFramework><RuntimeIdentifier>win7-x64RuntimeIdentifier>PropertyGroup>
          • 發(fā)布,最終可以得到可執(zhí)行程序。直接雙擊運(yùn)行,程序就可以以console的形式啟動,方便調(diào)試。

          • 命令行運(yùn)行xxxx.exe install就而可以安裝服務(wù),然后服務(wù)就可以自動啟動。

          • 命令行運(yùn)行xxxx.exe uninstall就可以卸載服務(wù)。整個過程不需要新建用戶與策略。


          后記

          吐槽:直接使用TopShelf,調(diào)試windows服務(wù)的過程變得不那么痛苦了,想起附加調(diào)試器的過程,簡直了。


          P.S. 需要最新版本的topshelf才可以支持asp.net core的服務(wù)部署。


          瀏覽 57
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人毛片女人AAA久久 | 亚洲婷婷av | 男人的天堂黄色 | 无码一区二区三区四区五区在线看 | 国产精品国产三级国芦专播精品人 |