此为系列文章,对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

ASP.NET CORE 基础知识(一):概述【上】的更多相关文章

  1. ASP.NET Core 基础知识(四) Startup.cs类

    ASP.NET Core应用程序需要一个启动类,按照约定命名为Startup.在 Program 类的主机生成器上调用 Build 时,将生成应用的主机, 通常通过在主机生成器上调用 WebHostB ...

  2. ASP.NET Core 基础知识(三) Program.cs类

    ASP.NET Framework应用程序是严重依赖于IIS的,System.Web 中有很多方法都是直接调用的 IIS API,并且它还是驻留在IIS进程中的.而 ASP.NET Core 的运行则 ...

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

    此为系列文章,对MSDN ASP.NET Core 的官方文档进行系统学习与翻译.其中或许会添加本人对 ASP.NET Core 的浅显理解 配置 ASP.NET Core提供了一个配置框架,其能够从 ...

  4. ASP.NET Core 基础知识(一) ASP.NET Core是什么?与.NET Framework、Mono之间的关系 ?

    一.概念: ASP.NET Core 是一个开源的.跨平台的 .NET 实现.而 .NET Framework 是基于 Windows 的 .NET 实现,Mono 是 .NET Framework ...

  5. ASP.NET Core 基础知识(五) 依赖关系注入

    参考https://www.cnblogs.com/jesse2013/p/di-in-aspnetcore.html 和 https://www.cnblogs.com/artech/p/net-c ...

  6. asp.net core 系列 10 配置configuration (上)

    一.  ASP.NET Core 中的配置概述 ASP.NET Core 中的应用配置是基于键值对,由configuration 程序提供. configuration  将从各种配置源提供程序操作键 ...

  7. ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 登录登出 上一章节我们总算完善了注册的功能,而且也添加了一个用户,现 ...

  8. ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 编辑表单 上一章节我们介绍了标签助手和 HT ...

  9. ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 EF SQLite 支持 上一章节我有提 ...

随机推荐

  1. docker usage (2)

    1. docker command docker start postgres docker container ls --all docker image ls --all docker ps -a ...

  2. python hashlib 详解

    1.概述 摘要算法简介 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定 ...

  3. 2、Spring-RootApplicationContext-refresh

    上一篇文中提到父容器root applicationContext最后是调用XmlWebApplicationContext去实现的, 但是什么时候开始解析标签(默认标签.自定义标签).注册bean以 ...

  4. MySql -- primary key主键约束

    4.primary key主键约束 在一张表中: 1) 主键约束是 NOT NULL.UNIQUE唯一的记录. 2) 主键约束必须是唯一的值. 3) 主键约束列不能包含 NULL 值. 注意:每个表都 ...

  5. python面试的100题(4)

    4.打乱一个排好序的list对象alist? import random alist = [1,2,3,4,5] random.shuffle(alist) print(alist) 结果为:[2, ...

  6. Docker+JMeter单机版+File Browser

    基于JMeter5.1.1+File Browser2.1.0  JMeter发起压测  File Browser作为文件服务器 一.目录结构: Dockerfile文件: FROM ubuntu:1 ...

  7. pycharm连接mysql5.7

    由于加密方式改变 需要在url后增加 ?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

  8. python logging 总结

    基本用法:   import sys   # 获取logger实例,如果参数为空则返回root logger logger = logging.getLogger("AppName" ...

  9. bzoj 1036: [ZJOI2008]树的统计Count (树链剖分)

    ps:这道题过的人真多啊 一道树剖的模板题 (好像还可以用lct做, 然而我并不会 代码如下 /**************************************************** ...

  10. 题解【CJOJ1371】[IOI2002]任务安排

    P1371 - [IOI2002]任务安排 Description N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分 ...