Startup类
作用:用来配置服务和请求管道。
服务是一种提供应用功能的可重用组件,在ConfigureServices
中注册服务,然后通过DI或applicationServices.GetRequriedService<T>()
在整个应用中使用服务。
在Program.cs
中构建主机(IHost
)时指定了Startup类webBuilder.UseStartup<Startup>();
框架会自动注册一些服务(具体有哪些见后续依赖注入章节),以下服务由框架自动注册所以可以直接注入到Startup
的构造函数:
IWebHostEnvironment
/IHostEvironment
:获取ApplicationName、EnvironmentName、ContentRootPath等。IHostLifeTime
:用来控制主机何时启动和停止IHostApplicationLifeTime
:与IHostedService配合使用,可以在主机启动前、停止时、停止后做一些事情。IConfiguration
Startup构造函数注入虽然只支持以上几种,但是你可以将任何已经向DI容器注册的服务注入到Startup的Configure方法里。
1.CongfigureService方法
作用:将各种各样的服务添加到服务容器
- 非必须,不一定要有这个方法
- 在主机(Host)调用Configure方法之前,优先会调用这个方法
- 一些常规的配置项(见配置章节)
2.Configure方法
作用:指定应用响应HTTP请求的方式,配置请求管道。方法的入参IApplicationBuilder
并不是IHost
注入的,而是托管创建的并直接传入。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
模板默认的管道有以下:
- 开发人员异常页
app.UseDeveloperExceptionPage()
(详见处理错误章节) - 异常处理程序
app.UseExceptionHandler("/Error")
;(详见处理错误章节) - HTTP严格传输安全性(HSTS)
app.UseHsts()
(详见安全和标识) - HTTPS重定向
app.UseHttpsRedirection()
;(详见安全和标识) - 静态文件
app.UseStaticFiles()
; - MVC和Razor Pages中间件
3.如果没有Startup文件该怎么配置服务?
在Program.cs
的CreateHostBuilder
方法中配置:
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"];
});
});
});
4.Startup过滤器:IStartupFilter
作用:其实是一个Configure方法的管道(这也是为什么要在ConfigureServices
方法里配置的原因),而不是Configure方法内各个中间件的管道。这个管道内有好多Configure方法。
使用场景:
- 你自己创建了一个库,你需要确保你的中间件在所有的中间件的开头或结尾运行
- 你正在使用一个
IStartupFilter
的库,你需要确保你的中间件在所有的中间件之前运行。 - 验证强类型配置
- 进行数据迁移和缓存预读取
参考:https://blog.csdn.net/qq_22949043/article/details/86516221
默认情况下,appsettings.json
和appsettings.{Environment}.json
文件会在更改后重新加载。如果不想被重新加载则在json中增加:hostBuilder:reloadConfigOnChange
节点。
5.多Startup:
如果同时存在多个,如Startup.cs、StartupDevelopment,.cs。如果当前环境是Development则会优先使用StartupDevelopment.cs。使用时通过assembly扫描:
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup(typeof(Startup).GetTypeInfo().Assembly.FullName);
});
同样startup的configure
和configureservices
方法也支持{Environment},即Configure{EnvironmentName}
和Configure{EnvironmentName}Services
。如:ConfigureDevelopmentServices、ConfigureStagingServices。
参考:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/environments?view=aspnetcore-5.0#environment-based-startup-class-and-methods