Startup 类
Startup 类位于:
已配置应用所需的服务。
应用的请求处理管道定义为一系列中间件组件。
配置应用程序的方式是 Program.cs 和 Startup.cs。Program.cs 作为 Web 应用程序的默认入口,不做任何修改的情况下,会调用同目录下 Startup.cs 中的 ConfigureServices 方法 和 Configure 方法。
ASP.NET Core一般使用Startup类来进行应用的配置。在构建应用主机时指定Startup类,通常通过在主机生成器上调用WebHostBuilderExtensions.UseStartup 方法来指定 Startup类。
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>(); }); }
Startup类中可以包含以下方法:
Startup构造函数
ConfigureServices方法,可选
Configure方法
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddDbContext<RazorPagesMovieContext>(options => options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext"))); services.AddControllersWithViews(); services.AddRazorPages(); } public void Configure(IApplicationBuilder app) { app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapDefaultControllerRoute(); endpoints.MapRazorPages(); }); } }
主机提供 Startup 类构造函数可用的某些服务。 应用通过 ConfigureServices 添加其他服务。 主机和应用服务都可以在 Configure 和整个应用中使用。
使用泛型主机 (IHostBuilder) 时,Startup构造函数中只能注入这三种类型的服务:IWebHostEnvironment、IHostEnvironment、IConfiguration。
尝试注入别的服务时会抛出InvalidOperationException异常。
因为主机启动时,执行顺序为Startup构造函数 -> ConfigureServices方法 -> Configure 方法。在Startup构造函数执行时主机只提供了这三个服务,别的服务需要在ConfigureServices方法中添加。然后到了Configure方法执行的时候,就可以使用更多的服务类型了。
ConfigureServices 方法
ConfigureServices 方法:
可选。
在 Configure 方法配置应用服务之前,由主机调用。
主机会调用ConfigureServices方法,将需要的服务以依赖注入的方式添加到服务容器,使其在Configure方法和整个应用中可用。
ConfigureServices方法的参数中无法注入除IServiceCollection之外的服务。具体使用时可以通过IServiceCollection的扩展方法为应用配置各种功能。
对于需要大量设置的功能,IServiceCollection 上有 Add{Service} 扩展方法。 例如,AddDbContext、AddDefaultIdentity、AddEntityFrameworkStores 和 AddRazorPages 。
Configure 方法
Configure 方法用于指定应用响应 HTTP 请求的方式。 可通过将中间件组件添加到IApplicationBuilder实例来配置请求管道。
Configure 方法可使用 IApplicationBuilder,但未在服务容器中注册。 托管创建 IApplicationBuilder 并将其直接传递到 Configure。
ASP.NET Core 模板配置的管道支持:
开发人员异常页
异常处理程序
HTTP 严格传输安全性 (HSTS)
HTTPS 重定向
静态文件
ASP.NET Core MVC 和 Razor Pages
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); }); }
前面的示例适用于Razor Pages;MVC 版本类似。
每个 Use 扩展方法将一个或多个中间件组件添加到请求管道。 例如,UseStaticFiles 配置中间件提供静态文件。
请求管道中的每个中间件组件负责调用管道中的下一个组件,或在适当情况下使链发生短路。
可以在 Configure 方法签名中指定其他服务,如 IWebHostEnvironment、ILoggerFactory 或 ConfigureServices 中定义的任何内容。如果这些服务可用,则会被注入。
在不启动的情况下配置服务
若要配置服务和请求处理管道,而不使用 Startup 类,请在主机生成器上调用 ConfigureServices 和 Configure 便捷方法。 多次调用 ConfigureServices 将追加到另一个。 如果存在多个 Configure 方法调用,则使用最后一个 Configure 调用。
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) => { }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureServices(services => { services.AddControllersWithViews(); }) .Configure(app => { var loggerFactory = app.ApplicationServices .GetRequiredService<ILoggerFactory>(); var logger = loggerFactory.CreateLogger<Program>(); var env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>(); var config = app.ApplicationServices.GetRequiredService<IConfiguration>(); logger.LogInformation("Logged in Configure"); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } var configValue = config["MyConfigKey"]; }); }); }); }