参考:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-3.1&tabs=visual-studio

背景:项目各个模块部署在不同位置,因此采用了微服务架构。由于安装部署环境的差异,部分模块只能部署在xp系统下,其他部署环境考虑使用net.core,在windows服务中托管webapi,或者在webapi中寄宿windows服务,总而言之就是在一个程序中将windows服务和webapi结合起来。

  项目中使用了两种将windows服务和webapi结合起来的方法、框架。一种是通过Topshelf,将控制台程序作为windows服务安装,同时将webapp启动的webapi寄宿到控制台程序中;第二种就是使用asp.net.core,托管到windows服务中。

  方法一:topshelf、控制台的方式。

  1.创建一个控制台应用程序,建议使用framework,据说某版本的topshelf不兼容netcore(未验证)。

  2.在main方法中使用以下代码。ServicesHost为自定义类,无其他父类。只需要实现其构造方法、服务开始方法、服务结束方法即可。如此即可将一个控制台程序作为windows服务来使用。关于服务的安装卸载,请自行查看topshelf,太简单不再赘述。

HostFactory.Run(x =>
{
x.Service<ServicesHost>(s =>
{
s.ConstructUsing(name => new ServicesHost());
s.WhenStarted(tc => tc.Start());
s.WhenStopped(tc => tc.Stop());
});
x.RunAsLocalSystem();
x.StartAutomaticallyDelayed();
x.SetDescription(“服务描述”);
x.SetDisplayName(“显示名称”);
x.SetServiceName(“服务名称”);//注意不要使用特殊字符
});

  3.在ServicesHost的适当位置使用WebApp,为webapi指定端口。

 WebApp.Start(string.Format("http://*:{0}", ConfigHelper.Instance.WebPort));

  4.自定义控制器,继承ApiController。在控制器上添加RoutePrefix属性或者Route来进行路径控制。系统部署后即可实现将webapi托管到windows服务中。

  方法二:在windows服务中托管asp.net.core。

  1.创建一个asp.net.core webapplication 项目。
  2.在program配置service。 注意:2、4中的代码应在CreateHostBuilder链式实现。

Host.ConfigureServices((host,services)=>{serices.AddHostedService<T where T:BackgroundService>()});

  3.自定义服务类T,继承BackgroundService,可以重写StartAsync、ExecuteAsync、StopAsync方法。在execute执行服务内容。

  4.配置host的默认配置,主要是指定端口号。

 Host.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder
.UseUrls("http://*:5001", "http://*:5002")//配置监听端口
.UseStartup<Startup>()
.UseKestrel();//指定托管服务器,Kestrel 或者iis服务器都可以,推荐使用Kestrel,可以在无iis的环境使用。
});

  5.路由的使用。微软的推荐方式是使用了Route属性,在属性内添加控制器的路由模板。如果想用rest风格,不妨在Route属性自定义模板,通俗点说就是每个控制器都自己有个模板,看起来比较麻烦点但也保证了控制器的灵活性。 eg:

[Route("[controller]")] // 访问路径: http://127.0.0.1:5002/WeatherForecast
public class WeatherForecastController : ControllerBase{}
[Route("api/[controller]")] 访问路径: http://127.0.0.1:5002/api/WeatherForecast
public class WeatherForecastController : ControllerBase{}

  总结:根据实际情况使用如果是考虑跨平台,就用第二种。如果系统环境限制可以考虑使用第一种,都各有优劣。

  

在windows服务中托管asp.net.core的更多相关文章

  1. windows 服务中托管asp.net core

    在windows 服务中托管asp.net core SDK 2.1.300 官方示例 1.添加运行标识符 xml <PropertyGroup> <TargetFramework& ...

  2. 在 Windows 服务中托管 ASP.NET Core

    众所周知,ASP.NET Core采用了和传统ASP.NET不同的托管和HTTP处理方式,即把服务器和托管环境完全解耦.ASP.NET Core内置了两个HTTP服务器实现,一个是基于libuv实现的 ...

  3. 在Windows服务中托管 ASP.NET Core的坑

    按照官网教程 https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/windows-service?view=aspnetcore- ...

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

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

  5. [转帖]以Windows服务方式运行ASP.NET Core程序

    以Windows服务方式运行ASP.NET Core程序 原作者blog: https://www.cnblogs.com/guogangj/p/9198031.htmlaspnet的blog 需要持 ...

  6. .Net Core 项目在Windows服务中托管【转载】

    本文以创建的WebAPI项目为例子进行讲解(本人使用VS Code创建的项目) 1.使用VS Code创建WebAPI项目(项目名称自定义) 2.在创建的项目csproj项目文件中,确认是否存在运行时 ...

  7. 以Windows服务方式运行ASP.NET Core程序

    我们对ASP.NET Core的使用已经进行了相当一段时间了,大多数时候,我们的Web程序都是发布到Linux主机上的,当然了,偶尔也有需求要发布到Windows主机上,这样问题就来了,难道直接以控制 ...

  8. 如何优雅的利用Windows服务来部署ASP.NET Core程序

    上一篇文章中我给大家讲述了五种部署ASP.NET Core网站的方法,其中有一种方式是通过Windows服务来进行部署,这样既可以做到开启自启动,又不会因为iis的反向代理而损失部分性能.但是美中不足 ...

  9. 以Windows服务方式运行ASP.NET Core程序【转载】

    我们对ASP.NET Core的使用已经进行了相当一段时间了,大多数时候,我们的Web程序都是发布到Linux主机上的,当然了,偶尔也有需求要发布到Windows主机上,这样问题就来了,难道直接以控制 ...

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

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

随机推荐

  1. [LeetCode]爬楼梯

    题目 假设你正在爬楼梯.需要 n 步你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解释: ...

  2. 【数据结构和算法】Trie树简介及应用详解

    作者:京东物流 马瑞 1 什么是Trie树 1.1 Trie树的概念 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经 ...

  3. Java基础1-1-3—java基础语法(条件控制语句)

    3. 条件控制语句 3.1 流程控制语句-顺序结构 流程控制语句:通过一些语句,来控制程序的[执行流程] 流程控制语句分类: 顺序结构 分支结构(if,switch) 循环结构(for,while,d ...

  4. wangeditor富文本编辑和vue3

    官网: wangEditor  https://www.wangeditor.com/v5/ 为啥用这个富文本编辑器(我觉得官网写自己优势已经非常好了没有啥可补充的了) 文档特别的全和友好 安装 ya ...

  5. 【分析笔记】全志平台 gpio-keys 驱动应用和 stack crash 解决

    内核配置 内核版本:Linux version 4.9.56 make ARCH=arm64 menuconfig Device Drivers ---> Input device suppor ...

  6. 走进Linux

    走进Linux Linux诞生 ​ BSD,Unix,Minix都是操作系统. ​ 1991年,林纳斯托瓦兹在上大学时,对操作系统很好奇.但是由于 386 BSD 还没有出来.可是他不喜欢他的 386 ...

  7. 1月10日内容总结——linux前期知识储备,linux系统、目录、文件相关命令,vi和vim,目录结构

    目录 一.前期必备知识 二.系统运⾏命令 帮助指令 关机/重启命令 三.快捷方式命令 四.⽬录结构与文件相关命令 1.pwd显示当前目录绝对路径指令 2.cd切换到指定目录指令 3.mkdir创建目录 ...

  8. 为什么 Linux 需要虚拟内存(转载)

    为什么 Linux 需要虚拟内存 原文链接: https://draveness.me/whys-the-design-os-virtual-memory/ 操作系统中的 CPU 和主内存(Main ...

  9. ASP.NET Core 系列总结

    <ASP.NET Core> 系列文章基于 .NET 3.1 和 .NET 6,主要是系统总结自己日常工作和学习中的知识点,之前是自己在 OneNote 上自己写,作为学习.总结笔记,逐渐 ...

  10. j-link "the connected j-link is defective"问题的解决

    出现这个原因是 J-link和J-link的驱动不匹配,比如J-link的固件太老,J-link驱动太新.因此要解决的话,要不就是换不同版本的J-link驱动,要不就是换J-Link或升级J-link ...