托管到Windows Service中

众所周知,ASP.NET Core采用了和传统ASP.NET不同的托管和HTTP处理方式,即把服务器和托管环境完全解耦。

ASP.NET Core内置了两个HTTP服务器实现,一个是基于libuv实现的Kestrel(支持跨平台),一个是基于Windows HTTP Server API实现的WebListener(仅支持Windows)。

而托管环境可以和服务器不相关,一般情况是自托管,或者托管到IIS/IISExpress中(此处的IIS仅作为反向代理把请求转发给所使用的服务器实现)。

因此,打算以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

使用它也很简单:

  1. 创建一个以.NET Framework为运行时的ASP.NET Core应用,即模版选择“ASP.NET Core Web Application (.NET Framework)”。VS2017中没有此模板,可以选择框架为.NET Framework4.6,模板为ASP.NET Core Web Application,然后编辑项目文件,修改TargetFramework为“<TargetFramework>net461;netcoreapp2.0</TargetFramework>”,这样编译出来就是两个框架的(NetCore本身就支持一个项目多个运行时的)
  2. 引用Microsoft.AspNetCore.Hosting.WindowsServices。--此包是.Net Framework的
  3. 在Program的Main方法中,把默认的host.Run改为host.RunAsService。
  4. 编译程序后,会在Debug目录下看到你选用的运行时版本的一个目录,比如“net46”,在里面会看到编译好的exe文件和一个类似“win7-x64”的这样文件夹。
  5. 进入到“win7-x64”文件夹,在命令行执行“sc create MyService binPath = "Full\Path\To\The\Console\file.exe --windows-service”(必须加参数,否则启动服务报1053错误),来创建一个Windows Service。注意:binPath必须是全路径。
  6. 这样就可以在Windows Service中托管ASP.NET Core应用了。
  7. 如果希望在服务启动和停止的过程中做一些额外处理,比如记录日志,那么可以实现一个CustomWebHostService来继承WebHostService ,并在其中编写所需的代码。
  8. 并实现如下的扩展方法:
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个问题要解决其实也非常简单。

支持不同启动方式

第二个问题的解决办法如下:

  1. 在Program的Main方法中,判断一下特定的命令行参数,比如“--windows-service”
  2. 以这个参数启动的情况下,就host.RunAsService,不是的话就host.Run。

就是这么简单粗暴。

支持不同运行时

.NET Core本来就支持一个项目多个运行时,就算把net46和netcoreapp1.0混合也是可以的。具体方法如下:

  1. 修改project.json文件,在frameworks下额外添加“netcoreapp1.0”。
  2. 把对Microsoft.AspNetCore.Hosting.WindowsServices的依赖移到net46下
  3. 在netcoreapp1.0下添加“Microsoft.NETCore.App”的依赖
  4. 在Program的Main方法中,基于条件编译的符号来判断不同的运行时,具体的符号表见:https://docs.microsoft.com/en-us/dotnet/articles/core/tutorials/libraries#how-to-multitarget

示例源代码

为了避免在文章中贴大段的源代码,大家转到GitHub中去看示例代码吧:https://github.com/heavenwing/HostingAspCoreAsWindowsService

ASP.NET Core应用到Windows Service中的更多相关文章

  1. 如何托管ASP.NET Core应用到Windows Service中

    (此文章同时发表在本人微信公众号"dotNET开发经验谈",欢迎右边二维码来关注.) 题记:正在构思一个中间件的设计,考虑是否既可以使用最新的技术,也可以兼顾传统的部署模式.所以有 ...

  2. ASP.NET Core在Azure Kubernetes Service中的部署和管理

    目录 ASP.NET Core在Azure Kubernetes Service中的部署和管理 目标 准备工作 注册 Azure 账户 AKS文档 进入Azure门户(控制台) 安装 Azure Cl ...

  3. NetCore Selfhost,IIShost,Windows Service Host详解(自宿主、宿主在IIS,宿主在Windows Service中)

    第一部分.自托管 一.依赖.Net Core环境 修改 project.json 文件内容,增加发布时需要包含文件的配置内容(NetCore2.0版本不需要任何设置,NetCore2.0开始彻底放弃p ...

  4. asp.net core 托管到windows服务,并用iis做反向代理

    使用NSSM把.Net Core部署至 Windows 服务   为什么部署至Windows Services 在很多情况下,很少会把.Net Core项目部署至Windows服务中,特别是Asp.n ...

  5. .NET 6学习笔记(3)——在Windows Service中托管ASP.NET Core并指定端口

    在上一篇<.NET 6学习笔记(2)--通过Worker Service创建Windows Service>中,我们讨论了.NET Core 3.1或更新版本如何创建Windows Ser ...

  6. ASP .NET CORE MVC 部署Windows 系统上 IIS具体步骤---.Net Core 部署到 IIS位系统中的步骤

    一.IIS 配置 启用 Web 服务器 (IIS) 角色并建立角色服务. 1.Windows Ddesktop 桌面操作系统(win7及更高版本) 导航到“控制面板” > “程序” > “ ...

  7. 尝新体验ASP.NET Core 6预览版本中发布的最小Web API(minimal APIS)新特性

    本文首发于<尝新体验ASP.NET Core 6预览版本中发布的最小Web API(minimal APIS)新特性> 概述 .NET开发者们大家好,我是Rector. 几天前(美国时间2 ...

  8. ASP.NET Boilerplate 学习 AspNet Core2 浏览器缓存使用 c#基础,单线程,跨线程访问和线程带参数 wpf 禁用启用webbroswer右键菜单 EF Core 2.0使用MsSql/MySql实现DB First和Code First ASP.NET Core部署到Windows IIS QRCode.js:使用 JavaScript 生成

    ASP.NET Boilerplate 学习   1.在http://www.aspnetboilerplate.com/Templates 网站下载ABP模版 2.解压后打开解决方案,解决方案目录: ...

  9. ASP.NET Core 新建项目(Windows) - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 新建项目(Windows) - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 新建项目(Windows) 对于任何语言和框架,都 ...

随机推荐

  1. ViewGroup的事件分发机制

    我们用手指去触摸Android手机屏幕,就会产生一个触摸事件,但是这个触摸事件在底层是怎么分发的呢?这个我还真不知道,这里涉及到操作硬件 (手机屏幕)方面的知识,也就是Linux内核方面的知识,我也没 ...

  2. eclipse配置及常用快捷键

    1. eclipse查看一个方法被谁引用(调用)的快捷键四种方式 1.(首推)双击选中该方法,Ctrl+Alt+H  如果你想知道一个类的方法到底被那些其他的类调用,那么请选中这个方法名,然后按“Ct ...

  3. Today is weekend不是应该一定会输出吗

    判断语句 If…else块,请看下面这个例子: <%! int day = 3; %> //声明变量感叹号 <html> <head><title>IF ...

  4. html的meta总结,html标签中meta属性使用介绍(转)

    html的meta总结,html标签中meta属性使用介绍 2014年11月5日 5928次浏览 引子 之前的我的博客中对于meta有个介绍,例如:http://www.haorooms.com/po ...

  5. Qt之图形(QPainterPath)

    简述 QPainterPath 类(绘图路径)提供了一个容器,用于绘图操作,可以创建和重用图形形状. 绘图路径是由许多图形化的构建块组成的对象,例如:矩形.椭圆.直线和曲线.构建块可以加入在封闭的子路 ...

  6. poj2378(dfs,树形dp)

    和poj3107,poj1655一样的方法 #include<iostream> #include<cstdio> #include<cstdlib> #inclu ...

  7. AlexNet神经网络结构

    Alexnet是2014年Imagenet竞赛的冠军模型,准确率达到了57.1%, top-5识别率达到80.2%. AlexNet包含5个卷积层和3个全连接层,模型示意图: 精简版结构: conv1 ...

  8. 运用 jenkins 让你的项目优雅的持续化集成

    0.到系统管理->系统设置 1.安装插件 Publish over SSH 2.配置 Publish over SSH 参数 1.pass 是私钥密码,此私钥文件放在安装 jenkins 的主机 ...

  9. 【JavsScript高级程序设计】学习笔记[1]

    1. 在HTML中使用javascript 在使用script嵌入脚本时,脚本内容不能包含'</script>'字符串(会被认为是结束的标志).可以通过转义字符解决('\') 默认scri ...

  10. manyToManyField理解和用法

    转:http://www.cnblogs.com/linxiyue/p/3667418.html