一、默认HostBuilder
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace MyWebApi
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
什么是Host?
Host 提供了使用预先配置的默认值创建 IHostBuilder 实例的方便方法
什么是主机生成器(HostBuilder )?
HostBuilder 是一个用于在应用程序中添加一些功能的对象。
什么是CreateDefaultBuilder()方法?作用?返回值?
CreateDefaultBuilder()方法 会应用清单的默认值于返回 HostBuilder。
args清单如下:
1.设置内容根路径(ContentRootPath)到当前目录(GetCurrentDirectory);
2.从 “DOTNET_” 带前缀到环境变量(prefixed environment variables)加载到主机(host);
3.从提供的命令行参数( command line args)加载到主机(host);
4.从appsettings.json和appsettings[Microsoft.Extensions.Hosting.IHostEnvironment.EnvironmentName].json加载到应用(app);
5.从User Secrets加载到应用(app);
6.从环境变量(environment variables)加载到应用(app);
7.从从提供的命令行参数( command line args)加载到应用(app);
8.配置控制台打印和事件资源的输出;
9.当[Microsoft.Extensions.Hosting.IHostEnvironment.EnvironmentName] 是 Development时,启用依赖项注入(dependency injection)容器上的范围验证。
返回(return)使用预先配置的默认值初始化类的新实例。
作用:
用预先配置的默认值初始化一个新的实例HostBuilder类
返回值:
已经初始化的 IHostBuilder
什么是ConfigureWebHostDefaults()方法?
ConfigureWebHostDefaults()是IHostBuilder的一个扩展方法,配置web主机的默认设置
作用:
用预先配置的默认值初始化类的新实例IWebHostBuilder
返回值:
链接主机生成器的接口(IHostBuilder)
在Program.cs脚本中主要干了两件事:
1.添加Web 主机生成器(CreateHostBuilder)
2.配置启动类(Startup.class)
---->然后返回Main方法中看
CreateHostBuilder(args).Build()?
作用:
用之前给定的事件也就是ConfigureWebHostDefaults()方法中的干的事情:
ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
通过web生成器(webBuilder)利用Startup类里的配置建立 WebHost as(作为) IHost
这个Build()方法只会被调用一次
返回值:
已经初始化好的的 IHost
CreateHostBuilder(args).Build().Run()?
作用:
运行应用并且阻塞回调线程直到主机关闭
二、启动类(Startup.Class)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace MyWebApi
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration {
get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
看这个类,先明白以下几个接口的作用:
IConfiguration
该接口表示一组键/值应用程序配置属性。
IServiceCollection
指定服务描述符集合的协定。
IApplicationBuilder
该接口提供配置应用程序请求管道的机制
IWebHostEnvironment
该接口提供有关正在运行应用程序的web托管环境的信息。
其中ConfigureServices和Configure方法都会在运行时调用。
ConfigureServices()?
通过之前的配置信息添加一个控制器可参考launchSettings.json配置控制器
Configure()?
env.IsDevelopment()
这个也是从配置信息中拿到,如果是development就使用开发者异常页面在Html中显示响应错误。配置地方在launchSettings.json中如下所示:
app.UseRouting()
添加一个端点路由中介软件(EndpointRouting—>允许不同程序协同工作)来指定IApplicationBuilder
app.UseAuthorization()
添加一个授权(Authorization)中介软件(允许不同程序协同工作)来指定IApplicationBuilder,
app.UseEndpoints()
添加一个路由(Endpoint)中介软件(允许不同程序协同工作)来指定EndpointDataSource实例从 EndpointRouteBuilder 配置,生成 EndpointMiddler,这个EndpointMiddler将会执行与当前请求相关的Endpoint。
endpoints.MapControllers()
通过endpoints映射相应的控制器,并不指定任意的控制器。