【翻译】asp.net core 3.0基本概念
这篇文章描述了开发asp.net core所需要掌握的基本概念。
原文地址:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/?view=aspnetcore-3.0&tabs=windows
StartUp类
Startup类用于:
- 配置应用程序所需的服务。
- 定义请求处理管道
服务是应用程序使用的组件。例如,日志记录组件是服务。配置(或注册)服务的代码被添加到StartUp类的ConfigureServices方法中。
请求处理管道由一系列的中间件组件构成。比如,一个中间件处理静态文件或者将http请求重定向到https请求上。每一个中间件在httpscontext上执行异步的操作,并调用下一个中间件或者终止请求。配置请求处理管道的代码会添加到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(); } }
关于StartUp的更多信息查看这里:App startup in ASP.NET Core.
依赖注入
asp.net core 有一个内置的依赖注入框架,可以使配置过的服务对于一个类可用。获取一个服务的方法之一是定义一个构造函数并将这个类所依赖的类型作为构造函数的参数声明,这个参数的类型可以是一个服务的类型或者是一个接口,依赖注入框架会在运行时注入他们。
下面的例子演示了依赖注入框架获取一个Entity Framework Core context对象的过程:
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方法中以UseXXXX形式的扩展方法进行配置。比如,启用静态文件,使用UseStaticFile方法。
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.
宿主(HOST)
一个ASP.NET Core应用程序在启动时构建一个主机。主机是一个封装了应用程序所有资源的对象,比如:
- 一个http服务器的实现
- 一堆中间件
- 日志
- 依赖注入
- 配置
在一个对象中包含应用程序所有相互依赖的资源的主要原因是生命周期管理:控制应用程序的启动和优雅的关闭。
有两种可用的主机:通用主机和Web主机。建议使用通用主机,而Web主机仅可用于向后兼容。
下面的代码在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,环境变量, 命令行输入变量, 以及其他的配置源中加载配置.
- 将日志输出到控制台和debug提供器上
更新的信息查询 .NET Generic Host.
非Web场景
通用主机允许其他类型的应用程序使用交叉(cross-cutting)框架扩展,如日志、依赖项注入(DI)、配置和应用程序生命周期管理。
从 .NET Generic Host and Background tasks with hosted services in ASP.NET Core.获取更多信息。
服务器
ASP.NET Core使用一个http服务器的实现来监听http请求。
服务器将应用程序的请求作为一组组成HttpContext的请求特性(feature)进行处理。
作为linux来说,ASP.NET Core提供了kestrel这个跨平台的服务器。在ASP.NET Core 2.0 以及后面的版本,Kestrel可以作为面向公众的边缘服务器运行,直接暴露在Internet上。Kestrel通常在Nginx或Ap的反向代理配置中运行。
从 Web server implementations in ASP.NET Core.获取更多信息。
配置
ASP.NET Core提供了一个配置框架,该框架以“名称-值”对的形式从一组有序的配置提供程序中获取设置。有针对各种源的内置配置提供程序,如.json文件、.xml文件、环境变量。
例如,您可以指定配置来自appsettings.json和环境变量。然后,当请求ConnectionString的值时,框架首先在appsettings.json中查找文件。如果在appsettings.json中找到了这个值,但同时环境变量也提供了,那么环境变量中的这个值会被优先使用。
如果要管理机密信息,asp.net core提供了一个 Secret Manager tool.
从 Configuration in ASP.NET Core.获取更多的信息。
选项(options)
在可能的情况下,ASP.NET Core遵循用于存储和检索配置值的选项模式。选项模式使用类来表示相关设置组。
下面的例子展示了WebSockets选项的配置:
var options = new WebSocketOptions { KeepAliveInterval = TimeSpan.FromSeconds(120), ReceiveBufferSize = 4096 }; app.UseWebSockets(options);
从 Options pattern in ASP.NET Core.查看更多信息
环境
执行环境,如Development, Staging, and Production,是asp.net core中的一等概念。
你可以通过ASPNETCORE_ENVIRONMENT这个环境变量来指定asp.net core的运行环境。asp.net core在启动时会读取这个环境变量并且将它存储在IHostingEnvironment接口的实现中。这个接口在应用程序的任何地方都可以通过依赖注入获取。
以下来自Startup类的示例代码仅在开发过程中运行时配置应用程序以提供详细的错误信息:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseMvc(); }
从这里查看更多信息: Use multiple environments in ASP.NET Core.
日志
ASP.NET Core支持与各种内置和第三方日志记录提供程序一起工作的日志API。可用的提供器包括:
- Console
- Debug
- Event Tracing on Windows
- Windows Event Log
- TraceSource
- Azure App Service
- Azure Application Insights
通过从DI获取一个ILogger对象并调用log方法,在应用程序的代码中编写来自任何地方的日志。
下面是使用ILogger对象的示例代码,其中突出显示了构造函数注入和日志方法调用:
public class TodoController : ControllerBase { private readonly ILogger _logger; public TodoController(ILogger<TodoController> logger) { _logger = logger; } [HttpGet("{id}", Name = "GetTodo")] public ActionResult<TodoItem> GetById(string id) { _logger.LogInformation(LoggingEvents.GetItem, "Getting item {Id}", id); // Item lookup code removed. if (item == null) { _logger.LogWarning(LoggingEvents.GetItemNotFound, "GetById({Id}) NOT FOUND", id); return NotFound(); } return item; } }
ILogger接口允许将任意数量的字段传递给日志记录提供程序。字段通常用于构造消息字符串,但提供程序也可以将它们作为单独的字段发送到数据存储区。该特性使日志提供商能够实现语义日志(也称为结构化日志)。
从Logging in .NET Core and ASP.NET Core.获取更多信息
路由
路由是映射到处理程序的URL模式。处理程序通常是一个Razor页面、MVC控制器中的一个动作方法或中间件。ASP.NET Core路由让您可以控制应用程序使用的url。
从 Routing in ASP.NET Core.获取更多信息。
错误处理
ASP.NET core有一个内建的功能来进行错误处理,如:
- 开发者的异常页面
- 自定义的错误处理页面
- 静态的状态页
- Startup exception handling
从 Handle errors in ASP.NET Core.获取更多的信息
发起http请求(HttpClientFactory)
一个IHttpClientFactory接口的实现被用来创建一个HttpClient实例,这个接口:
- 提供命名和配置逻辑HttpClient实例的中心位置。例如,可以注册并配置一个github客户端来访问github。可以为其他目的注册缺省客户端。
- 支持多个委托处理程序的注册和链接,以构建传出请求中间件管道。此模式类似于ASP.NET Core中的入站中间件管道。该模式提供了一种机制来管理HTTP请求的横切关注点,包括缓存、错误处理、序列化和日志记录。
- 与Polly集成,这是一个流行的用于瞬态故障处理的第三方库。
- 管理底层HttpClientMessageHandler实例的池和生存期,以避免在手动管理HttpClient生存期时出现的常见DNS问题。
- 为通过工厂创建的客户端发送的所有请求添加可配置的日志记录体验(通过ILogger)。
查看 Make HTTP requests using IHttpClientFactory in ASP.NET Core.获取更多信息。
Content root
content root是以下内容的根路径:
- 托管应用程序的可执行文件(.exe)。
- 编译过的组成应用程序的程序集(.dll)。
- app使用的非代码内容文件,如:1、Razoe文件(.cshtml,.razor)2、配置文件(.json,.xml)3、数据文件(.db)
- Web root,通常指发布了的wwwroot 文件夹。
在开发期间:
- content root是你项目的根目录
- 项目的根目录用于创建:
- 项目根目录中应用程序的非代码内容文件的路径。
- Web root, 通常是项目根目录下的wwwroot文件夹
从.NET Generic Host获取更多信息。
在 building the host.期间可以指定一个可选的content root路径。
Web root
web root是公共的、非代码的静态资源文件的根路径,如:
- Stylesheets (.css)
- JavaScript (.js)
- Images (.png, .jpg)
默认情况下静态文件只能从web root(或者它的子目录)提供。
web root的默认路径是{content root}/wwwroot,但是可以在 building the host.期间指定一个不同的。从 .NET Generic Host.获取更多信息。
在razor(.cshtml)文件中波浪号斜线(~/)代表了web root,以~/开头的路径称为虚拟路径。
从 Static files in ASP.NET Core.获取更多信息