众所周知,ASP.NET Core采用了和传统ASP.NET不一样的托管和HTTP处理方式,即把服务器和托管环境彻底解耦。git
ASP.NET Core内置了两个HTTP服务器实现,一个是基于libuv实现的Kestrel(支持跨平台),一个是基于Windows HTTP Server API实现的WebListener(仅支持Windows)。github
而托管环境能够和服务器不相关,通常状况是自托管,或者托管到IIS/IISExpress中(此处的IIS仅做为反向代理把请求转发给所使用的服务器实现)。web
所以,打算以Windows Service这种比较传统的方式来部署ASP.NET Core的Web应用也是可行的(本质仍是自托管,只是启动进程并不是控制台程序,而是一个Windows Service)。这不,微软就很贴心的提供了一个Nuget来支持:Microsoft.AspNetCore.Hosting.WindowsServices,它的源码在:https://github.com/aspnet/Hosting/tree/dev/src/Microsoft.AspNetCore.Hosting.WindowsServices。json
使用它也很简单:windows
WebHostService
,并在其中编写所需的代码。public static class CustomWebHostWindowsServiceExtensions { public static void RunAsCustomService(this IWebHost host) { var webHostService = new CustomWebHostService(host); ServiceBase.Run(webHostService); } } host.RunAsCustomService();
把ASP.NET Core应用托管到Windows Service中,就这么简单!服务器
不过,我想从个人场景来谈谈为何我有托管到Windows Service的需求。这几天在构思一个中间件(包含多个组件)的架构,考虑到初期会以比较传统的方式来部署,后期有可能跨平台,而且但愿组件之间可以相对独立和解耦。因此,最天然的想法就是架构设计为微服务,基于ASP.NET Core实现(将来不排除使用其余技术栈)。部署的话,初期分离部署为多个Windows Service,后期也能够很平滑的过分到容器或者相似Service Fabric这样的微服务运行平台中。架构
基于这样的设计考虑,要解决的第一个问题就是是否能够把ASP.NET Core应用托管到Windows Service中(上面已经验证了),第二个问题是是否能够根据环境条件跑在不一样的启动进程中,第三问题是是否能够同时支持多种运行时。2,3个问题要解决其实也很是简单。app
第二个问题的解决办法以下:框架
就是这么简单粗暴。微服务
.NET Core原本就支持一个项目多个运行时,就算把net46和netcoreapp1.0混合也是能够的。具体方法以下:
为了不在文章中贴大段的源代码,你们转到GitHub中去看示例代码吧:https://github.com/heavenwing/HostingAspCoreAsWindowsService