program.cs
ASP.NET Core 程序基于一个命令行的程序运行,程序的入口在program.cs的main方法。javascript
public static void Main(string[] args) {
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build()
.Run();
}
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
CreateDefaultBuilder方法
这个方法负责返回给咱们一个WebHostBuilder, 而且调用了如下扩展方法:php
- UseKestrel 使用kestrel server来处理请求
- UseContentRoot 设置站点目录
- ConfigureAppConfiguration
- ConfigureLogging
UseKestrel
WebHost负责托管ASP.NET Core,可是它并不真正从服务器网卡上监听端口以及将网络字节转换到.net core的管道。这些由IServer来处理。css
这里先简单了解一下这个过程,咱们后面会在IServer的环节再详述。咱们这里使用的UseKestrel 来自于github上的项目 KestrelHttpServer。html
里面的Kestrel项目下有一个WebHostBuilderKestrelExtensions类。里面就是这个 UseKestrel扩展方法的定义:java
public static IWebHostBuilder UseKestrel( this IWebHostBuilder hostBuilder) {
return hostBuilder.ConfigureServices(services =>
{
// Don't override an already-configured transport
services.TryAddSingleton<
ITransportFactory,
SocketTransportFactory>();
services.AddTransient<
IConfigureOptions<KestrelServerOptions>,
KestrelServerOptionsSetup>();
services.AddSingleton<
IServer,
KestrelServer>();
});
}
其实也很简单,都是在进行Server依赖的配置,由于最终的执行都由WebHost来展控。因此WebHost大量依赖的其它外部组件都被定义成接口放到了HttpAbstractions里面,而后由外部扩展方法(多以Use开头,进行配置)git
ASP.NET Core源码里面大量使用扩展方法进行Servier DI的配置,扩展方法定义在各类不一样的命名空间以及项目下。若是不习惯或者不了解相关的部分会以为有些痛苦。程序员
ConfigureAppConfiguration
这个方法专门用来为 WebHostBuilder添加配置,包括appsettings.json的、命令行参数以及环境变量。关于配置这一节咱们留在后面具体来说。github
config.AddJsonFile(
"appsettings.json",
optional: true,
reloadOnChange: true)
.AddJsonFile(
$"appsettings.{env.EnvironmentName}.json",
optional: true,
reloadOnChange: true);
config.AddEnvironmentVariables();
config.AddCommandLine(args);
ConfigureLogging
logging也是 ASP.NET Core内置组件中的很重要一个,这个方法在默认已经为咱们添加了appsettings中的logging配置以及控制台log。关于日志这一节咱们留在后面具体来说。web
logging.AddConfiguration(
hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
UseStartup<>
Startup.cs这个类主要作两件事情的配置Service DI和http管道,这些都是在WebHost启动以前就须要肯定下来的。而UseStartup就是将咱们定义的Startup.cs和 IStartup绑定起来,让WebHost能够找获得。 怎么绑定呢? 固然仍是依赖注入:json
if (typeof(IStartup)
.GetTypeInfo()
.IsAssignableFrom(startupType.GetTypeInfo()))
{
services.AddSingleton(typeof(IStartup), startupType);
}
else
{
services.AddSingleton(typeof(IStartup), sp =>
{
var hostingEnvironment =
sp.GetRequiredService<IHostingEnvironment>();
return new ConventionBasedStartup(
StartupLoader.LoadMethods(
sp,
startupType,
hostingEnvironment.EnvironmentName));
});
}
VS为咱们添加的Startup.cs默认不继续IStartup接口,因此是采用Convention的这种方式,固然咱们也能够继承IStartup则直接注册成单例到应用程序。
以上是整个 WebHostBuilder的准备阶段,即往里面放了不少的参数。下一篇咱们将接着讲Builder阶段,给了你那么多,你要开始制造点什么东西给我了。
本文首发于公众号jessetalk,转载请保留公众号二维码。
6 条评论
zhang · 2017年11月25日 下午1:06
支持
fei · 2017年11月25日 下午1:07
评论加邮箱是否有些多余
码农阿宇 · 2017年12月14日 下午10:06
感谢腾飞写了这么好的文章,已经转发并注明了来源而且保留了公众号二维码 谢谢
Chain · 2017年12月29日 上午9:19
已学习。
Allen · 2018年2月27日 下午2:37
感谢
Jay · 2018年7月16日 下午6:13
支持,感谢