ASP.NET CORE 基础知识(一):概述【上】
此为系列文章,对MSDN ASP.NET Core 的官方文档进行系统学习与翻译。其中或许会添加本人对 ASP.NET Core 的浅显理解
原文请参考 MSDN ASP.NET Core。
这篇文章是对一些关键概念的概述,它们可以帮助你理解如何开发ASP.NET Core应用程序。
Startup类
在startup类中:
- 配置了应用程序需要的服务
- 定义了请求处理管道
所谓服务,便是app需要用到的一些组件。举个例子,一个日志组件便是一个服务。配置服务(或者说是注册服务)的代码被加在Startup.ConfigureServices方法中。
而请求处理管道包含一些列的中间件组件。举例来说,一个中间件可能会处理对静态文件的请求,或者将HTTP请求重定向为HTTPS请求。每一个中间件都会在HttpContext对象上进行异步操作,接下来其要么激活请求管道中的下一个中间件,要么终止请求。配置请求处理管道的代码被添加在了 Startup.Configure方法中。
这里有一个示例的Startup类:
public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddMvc() .SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddDbContext<MovieContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MovieDb"))); } public void Configure(IApplicationBuilder app) { app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseMvc(); } }
获取更多的信息,请参考:App startup in ASP.NET Core.
依赖注入(服务)
ASP.NET Core有一个内建的DI框架,其使得已配置的服务对于应用程序的类来说是可用的。在一个类中获取一个服务实例的一种方式便是创建一个构造函数,并以所需的类型作为此构造函数的参数。构造函数的参数可以是服务类型或者接口。DI系统会在运行时提供具体的服务实例。
如下是一个类,其使用DI来获取Entity Framework Core上下文对象。高亮显示的那行是构造函数注入的示例:
public class IndexModel : PageModel { private readonly RazorPagesMovieContext _context; public IndexModel(RazorPagesMovieContext context) { _context = context; } // ... public async Task OnGetAsync() { var movies = from m in _context.Movies select m; Movies = await movies.ToListAsync(); } }
虽然DI是内建的,但其设计为可以使你插入第三方的IoC容器,因而如果你愿意的话,便可以对其进行自定义。
中间件
请求处理管道包含一些列的中间件组件。每一个中间件都会在HttpContext对象上进行异步操作,接下来其要么激活请求管道中的下一个中间件,要么终止请求。按照约定,中间件组件通过在Startup.Configure中调用它的UseXXX扩展方法被添加到管道中。举例来说,为了启用对于静态文件的渲染,便会调用UseStaticFiles方法。
如下示例中,高亮代码配置了请求处理管道:
public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddMvc() .SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddDbContext<MovieContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MovieDb"))); } public void Configure(IApplicationBuilder app) { app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseMvc(); } }
ASP.NET Core包含一组丰富的内建的组件,除此之外,你也可以写自己的自定义组件。
获取更多的信息,请参考ASP.NET Core Middleware。
宿主
ASP.NET Core app在Startup类中建立了宿主。宿主是封装了所有app资源的一个对象,比如:
- 一个HTTP 服务实现
- 中间件组件
- 日志
- 依赖注入
- 配置系统
将app所有相互依存的资源包含在一个对象的主要理由便是生命周期管理,在Startup中进行控制并优雅的关闭。
两种宿主是可用的:Generic Host 以及 Web Host。推荐使用Generic Host,而 Web Host仅仅用于向后兼容。
创建宿主的代码是在Program.Main中:
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>(); }); }
CreateDefaultBuilder
和 ConfigureWebHostDefaults
用通用选项配置了一个宿主,例如如下所示:
- 使用Kestrel作为一个Web服务器,并启用了IIS集成。
- 从 appsettings.json, appsettings.{Environment Name}.json,环境变量,命令行参数,以及其他配置资源加载配置信息。
- 向控制台以及调试提供器发送日志输出。
更多信息,请参考.NET Generic Host。
非Web 情形
Generic Host允许其他类型的App使用横切( cross-cutting)的框架扩展,例如日志,依赖注入,配置,以及app生命周期管理,获取更多信息,请参考 .NET Generic Host 和 Background tasks with hosted services in ASP.NET Core。
服务器
一个ASP.NET Core app 使用一个HTTP 服务器实现来监听HTTP请求。服务器将对app的请求适配为一些列的请求特性(request features ),它们被包含在一个HttpContext对象中。对于Windows系统来说,ASP.NET Core 提供了如下的服务器实现:
- Kestrel是一个跨平台的Web服务器,Kestrel常常被用在使用IIS的反向代理中。在ASP.NET Core 2.0及后续版本中,Kestrel能够以一个面向公共的边界服务器来运行,其可以直接暴漏给因特网。
- IIS HTTP服务器是一个使用IIS的面向Windows的服务器。使用这个服务器,ASP.NET Core app 和 IIS在一个进程中运行。
- HTTP.sys是一个面向不与IIS一起使用的Windows系统的服务器
获取更多信息,请参考:Web server implementations in ASP.NET Core。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南