在windows服务中托管asp.net.core
背景:项目各个模块部署在不同位置,因此采用了微服务架构。由于安装部署环境的差异,部分模块只能部署在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的更多相关文章
- windows 服务中托管asp.net core
在windows 服务中托管asp.net core SDK 2.1.300 官方示例 1.添加运行标识符 xml <PropertyGroup> <TargetFramework& ...
- 在 Windows 服务中托管 ASP.NET Core
众所周知,ASP.NET Core采用了和传统ASP.NET不同的托管和HTTP处理方式,即把服务器和托管环境完全解耦.ASP.NET Core内置了两个HTTP服务器实现,一个是基于libuv实现的 ...
- 在Windows服务中托管 ASP.NET Core的坑
按照官网教程 https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/windows-service?view=aspnetcore- ...
- .NET 6学习笔记(3)——在Windows Service中托管ASP.NET Core并指定端口
在上一篇<.NET 6学习笔记(2)--通过Worker Service创建Windows Service>中,我们讨论了.NET Core 3.1或更新版本如何创建Windows Ser ...
- [转帖]以Windows服务方式运行ASP.NET Core程序
以Windows服务方式运行ASP.NET Core程序 原作者blog: https://www.cnblogs.com/guogangj/p/9198031.htmlaspnet的blog 需要持 ...
- .Net Core 项目在Windows服务中托管【转载】
本文以创建的WebAPI项目为例子进行讲解(本人使用VS Code创建的项目) 1.使用VS Code创建WebAPI项目(项目名称自定义) 2.在创建的项目csproj项目文件中,确认是否存在运行时 ...
- 以Windows服务方式运行ASP.NET Core程序
我们对ASP.NET Core的使用已经进行了相当一段时间了,大多数时候,我们的Web程序都是发布到Linux主机上的,当然了,偶尔也有需求要发布到Windows主机上,这样问题就来了,难道直接以控制 ...
- 如何优雅的利用Windows服务来部署ASP.NET Core程序
上一篇文章中我给大家讲述了五种部署ASP.NET Core网站的方法,其中有一种方式是通过Windows服务来进行部署,这样既可以做到开启自启动,又不会因为iis的反向代理而损失部分性能.但是美中不足 ...
- 以Windows服务方式运行ASP.NET Core程序【转载】
我们对ASP.NET Core的使用已经进行了相当一段时间了,大多数时候,我们的Web程序都是发布到Linux主机上的,当然了,偶尔也有需求要发布到Windows主机上,这样问题就来了,难道直接以控制 ...
- 如何托管ASP.NET Core应用到Windows Service中
(此文章同时发表在本人微信公众号"dotNET开发经验谈",欢迎右边二维码来关注.) 题记:正在构思一个中间件的设计,考虑是否既可以使用最新的技术,也可以兼顾传统的部署模式.所以有 ...
随机推荐
- C++ 一种交换两个数的思路
在 Lua 或者 Python 中可以使用多值赋值语句来交换两个数.例如:a, b = b, a.在 C++ 中有没有类似的操作? 先解析一下多值赋值的原理,a, b = b, a 等价于 t1, t ...
- 作业详解及流程控制之for循环
作业详解及流程控制之for循环 目录 作业详解及流程控制之for循环 一.作业详解 1.根据用户输入内容打印其权限 2.编写用户登录程序 4.猜年龄的游戏 二.流程控制之for循环 三.while循环 ...
- DML_修改数据
DML_修改数据 修改数据: 语法: update 表名 set 列名1 = 值1,列名2 = 值2, ... [ where 条件 ] ; 注意: 1. 如果不加任何条件,则会将表中所有记录全部修改 ...
- linux 基础(6)简单认识 bash
shell 和 bash 是什么? shell 是一种应用程序,在这个程序里输入文字指令,系统就会做出响应的操作.这个"壳程序"是我们使用系统各种功能的接口,学会了 shell 就 ...
- C#依赖注入(直白明了)讲解 一看就会系列
最基础的:UI-BLL-DAL 这是我们耳熟能详的分层 (补充:) 我们的类正常都不是孤立存在的.很多都是要依赖于其它的类. 比如说我们有一个Work类,Work类在工作的时候需要把信息记录下来. ...
- Python第三方库arrow
Python第三方库arrow https://pypi.org/project/arrow/ 简介 处理时间日期的一个第三方库 Arrow is a Python library that offe ...
- STM32F1库函数初始化系列:定时器中断
1 static void TIM3_Configuration(void) //10ms 2 { 3 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 4 ...
- kali linux生成密码字典方法
kali linux生成密码字典方法 所谓的密码字典主要是配合密码破解软件所使用,密码字典里包括许多人们习惯性设置的密码.这样可以提高密码破解软件的密码破解成功率和命中率,缩短密码破解的时间.当然,如 ...
- HDMI转USB视频采集卡(ACASIS 1080P高清视频采集卡)--九五小庞
ACASIS阿卡西斯是深圳市菲德越科技有限公司旗下数码科技品牌.菲德越是2008年成立的一家专注于采集卡.硬盘盒.集线器等专业3C配件产品,集研发.设计.生产.销售于一体的高新科技公司,我们公司以向客 ...
- 跳板攻击之:frp代理转发
跳板攻击之:frp代理转发 目录 跳板攻击之:frp代理转发 1 frp 介绍 2 frp 原理 3 实验环境 3.1 实验准备 3.2 实验拓扑 4 frp代理socks 5 frp代理stcp安全 ...