上篇讲到.net core web app是如何启动并接受请求的,下面接着探索kestrel server是如何完成此任务的。
1.kestrel server的入口KestrelServer.Start(Microsoft.AspNetCore.Hosting.Server.IHttpApplication)
FrameFactory创建的frame实例最终会交给libuv的loop回调接收请求。但是在这过程中还是有很多的初始化工作需要做的。后面我们就管中窥豹来看一看。
public void Start<TContext>(IHttpApplication<TContext> application)
{ var engine = new KestrelEngine(new ServiceContext
{
FrameFactory = context =>
{ return new Frame<TContext>(application, context);
},
AppLifetime = _applicationLifetime,
Log = trace,
ThreadPool = new LoggingThreadPool(trace),
DateHeaderValueManager = dateHeaderValueManager,
ServerOptions = Options
}); //启动引擎。完成libuv的配置和启动
engine.Start(threadCount); //针对绑定的多个地址创建server来接收请求。也就是针对ip:port来启动tcp监听
foreach (var address in _serverAddresses.Addresses.ToArray())
{
engine.CreateServer(ipv4Address);

