ASP.Net Core Startup类
我们了解了Program类如何负责创建和配置Web主机。但是,在构建和运行主机之前,Program类将调用startup类以进行进一步配置。它从类中调用Configure&ConfigureServices方法。
什么是Startup类
ASP.NET Core 启动(startup.cs)类是一个简单的类,不继承任何接口。这是我们配置请求管道和中间件的地方。我们还可以配置服务并将其添加到依赖项注入容器中。该类必须包含方法Configure,并且可以选择性的包含ConfigureServices方法。它类似于经典ASP.NET中的global.asax。
为什么要使用Startup类?
Program类与Startup类是ASP.NET Core应用程序中最重要的两个类。应用程序的所有配置都在这两个文件中进行。
配置应用程序基础结构的Program类。
Program配置应用程序基础设施。program类在启动时创建web主机。然后,它配置日志记录DI容器。配置系统,Kestrel Web服务器,IIS集成等。它还将框架服务添加到DI容器中,以便我们可以使用它。
Startup类的作用
Startup类是我们配置应用程序组件的地方。Startup类具有两个主要功能。
- 配置服务以进行依赖注入。
- 它配置请求管道,管道处理对应用程序发出的所有请求。
Startup类的示例
启动类通常命名为startup.cs。它位于项目根目录中。Main方法是应用程序的入口点。它配置WebHost,对其进行构建并运行。然后,主机接收HTTP请求,并将其传递到请求管道。WebHost在构建WebHost之前调用UseStartup方法。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
UseStartup方法指示WebHost在何处查找Startup类。启动类通过约定的方式命名。我们可以使用任何名称创建一个启动类。例如,如果我们希望将AppStartup用作Startup类,请记住将其包含在程序中
.UseStartup<AppStartup>()
启动中可用的服务
服务 |
目的 |
IApplicationBuilder |
我们将此服务用于应用程序请求管道。 |
IHostingEnvironment |
此服务提供当前的EnvironmentName,ContentRootPath,WebRootPath和Web根文件提供程序 |
ILoggerFactory |
提供创建记录器的机制 |
IServiceCollection |
这是一个DI容器。我们将服务添加到此容器中。 |
方法 |
可用服务 |
Startup Constructor |
IHostingEnvironment和ILoggerFactory |
ConfigureServices |
IServiceCollection |
Configure |
IApplicationBuilder,IHostingEnvironment和ILoggerFactory |
配置服务
ConfigureServices是我们配置服务的方法。将服务添加到DI容器中。此方法是可选的。但是,如果存在,那么它是WebHost调用的第一个方法。ConfigureServices方法将服务实例(类型为IServiceCollection)作为参数。 服务的实例通过依赖注入注入到ConfigureService中。
public void ConfigureServices(IServiceCollection services) {
IServiceCollection是DI容器。我们将服务添加到此容器中。
services.AddMvc();
将服务添加到DI容器将使它们可用于依赖注入。这意味着我们可以在应用程序中的任何位置注入这些服务。依赖注入是ASP.NET Core的新功能之一。ASP.NET Core广泛使用依赖项注入。下面的示例显示了一种典型ConfigureServices方法。
public void ConfigureServices(IServiceCollection services) {
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc();
}
Configure
Configure方法是必须的。在ConfigureServices方法之后调用它。configure方法允许我们配置ASP.NET Core请求管道。该请求管道指定应用程序应该如何响应HTTP请求。组成请求管道的组件称为中间件。configure方法典型的配置如下所示。如果我们选择MVC Web应用程序(MVC)模板,那么Visual Studio生成如下的方法。
// 运行时将调用此方法。 使用此方法来配置HTTP请求管道。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();
app.UseCors("AllowAll");
app.UseAuthentication();
app.UseMvc(routes =>
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
Configure方法需要 提供IApplicationBuilder和HostingEnvironment的实例。上面的代码没有注入ILoggerFactory,但是我们可以这样做。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
然后,我们将中间件组件添加到IApplicationBuilder实例的实例中。第一行检查我们是否处于开发环境中。 如果是,它将使用扩展方法UseDeveloperExceptionPage注册DeveloperExceptionPage中间件。
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
在随后的几行中,我们将注册另外三个中间件。
app.UseStaticFiles();
app.UseCors("AllowAll");
app.UseAuthentication();
最后一行代码注册了MVC中间件。 在注册中间件时配置了路由。
app.UseMvc(routes =>
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
configure方法
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
我们使用应用程序的run方法来注册嵌入式中间件。启动类(startup.cs)类是我们配置应用程序组件的位置。可选ConfigureServices方法是我们注册DI服务的地方。Configure方法是我们建立请求管道的地方。然后,在构建和运行Web主机之前,CreateDefaultBuilder方法将读取启动内容以配置Web主机。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义