asp.net core很大的方便了跨平臺的開發者,linux的開發者可使用apache和nginx來作反向代理,windows上能夠用IIS進行反向代理。
反向代理能夠提供不少特性,當然很好。可是還有複雜性,咱們也可使用windows service來直接啓動kestrel。linux
asp.net core官方網站提供了一種基於windows服務部署的方法:在 Windows 服務中託管 ASP.NET Core
這種方式須要修改代碼,而後部署的時候,使用命令行建立、安裝服務,而後再啓動。nginx
感受仍是不夠爽快,咱們可使用topshelf改造一下。shell
topshelf能夠很便捷地將一個windows console程序改形成windows service,只須要稍微修改一下代碼結構,而後經過nuget包就能夠簡單操做了。安裝與部署也是極其方便,並且,topshelf在調試的時候,直接是做爲console程序,極其便於調試。apache
TopShelf項目地址:http://topshelf-project.com/json
首先引用nuget包:c#
Install-Package TopShelf
而後改造一下program.cswindows
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方法轉移到了這個類中:app
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進行設置)。框架
<PropertyGroup> <TargetFramework>netcoreapp2.1</TargetFramework> <RuntimeIdentifier>win7-x64</RuntimeIdentifier> </PropertyGroup>
吐槽:直接使用TopShelf,調試windows服務的過程變得不那麼痛苦了,想起附加調試器的過程,簡直了。
P.S. 須要最新版本的topshelf才能夠支持asp.net core的服務部署。asp.net