.netcore入门22:aspnetcore通用主机
程序员文章站
2024-01-29 18:17:40
...
环境:
- window 10
- .netcore 3.1
- vs2019 16.5.1
参照:
asp.net core 系列 17 通用主机 IHostBuilder
一、什么是通用主机?
通用主机就是微软抽象出来的一个资源容器,它里面包括了配置模型、日志框架、依赖注入容器等。它里面还包括主机服务(IHostedService:存放在依赖注入容器中),这样当通用主机启动或停止的时候实际上就是针对这个主机服务进行开启和停止操作。
二、为什么要有通用主机?
在.net2.x以前我们创建aspnetcore应用是使用WebHost.Create...
去创建的,现在我们是使用Host.CreateDefaultBuilder()...
去创建的,早先的那种就限制主了aspnetcore只能为http服务使用,如果从我只想开一个定时服务或者是搞个消息队列什么的,那就尴尬了,所以微软抽象出来了通用主机
,然后aspnetcore web框架就是在通用主机里注入一个主机服务。
三、Program中的默认生成代码
可以看到,createBuilder=》build()=》run()都是通用主机的东西,Web服务是在ConfigureWebHostDefaults方法中被注入到通用主机里的
四、测试非web服务的通用主机
新建一个空的web项目,将Program中的代码替换成如下:
public class Program
{
public static void Main(string[] args)
{
Host.CreateDefaultBuilder()
new HostBuilder()
.ConfigureServices(services =>
{
services.AddLogging();
services.AddSingleton<IHostedService, MyHostService>();
})
.ConfigureLogging(loggingBuilder =>
{
loggingBuilder.AddConsole();
})
.Build()
.Run();
Console.WriteLine("ok");
Console.ReadLine();
}
}
public class MyHostService : IHostedService
{
private readonly ILogger<MyHostService> logger;
public MyHostService(ILogger<MyHostService> logger)
{
this.logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
{
return Task.Factory.StartNew(() =>
{
while (true)
{
if (cancellationToken.IsCancellationRequested) break;
logger.LogInformation("MyHostService is Comming...");
Thread.Sleep(5000);
}
});
}
public Task StopAsync(CancellationToken cancellationToken)
{
logger.LogInformation("MyHostService is stop!");
return Task.CompletedTask;
}
}
直接运行,看控制台输出:
推荐阅读
-
.netcore入门22:aspnetcore通用主机
-
.netcore入门20:aspnetcore集成log4net
-
.netcore入门21:aspnetcore集成Serilog
-
.netcore入门24:aspnetcore源码分析之在通用主机上配置web服务
-
.netcore入门18:aspnetcore分布式缓存(分布式内存、sqlserver、redis)
-
.netcore入门19:aspnetcore集成Swagger
-
.netcore入门12:aspnetcore中cookie认证之服务端保存认证信息
-
.netcore入门10:分析aspnetcore自带的cookie认证原理