ASP.NET CORE 基础知识(一):概述【上】

时间:2023-03-09 16:39:16
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.jsonappsettings.{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

相关文章