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

    Motif discovery is in loose terms the problem of finding interesting patterns in sequences. motif: i ...

  2. Python 入门【一】Python 初识及学习资料

    Python 初识及学习路线: CodeCademy Python 在线教学: 廖雪峰 Python 2.7 教程: 廖雪峰 Python 3.0 教程: Python 官方文档(2.7~3.7:英文 ...

  3. flask 路由规划(blueprint)

    # 统一路由蓝牙规划 # file:blueprint_route.py from flask import Blueprint route_test = Blueprint("home&q ...

  4. css的div动态水平垂直居中

      div动态水平垂直居中,思路如下: (1)先定位.如果相对于距离最近的父元素,用absolute:如果相对于body,用fixed. (2)然后,top和left都设为50%. (3)要居中的di ...

  5. 1.rest之@Get和@Post请求的区别:

    区别: (1)@Get 一般用于查询或获取资源信息, @Post一般是用于更新资源信息. (2)Url不同, @Get 请求的url: http://localhost:8080/imeter-cms ...

  6. AcWing 802. 区间和 离散化

    https://www.acwing.com/problem/content/804/ #include <iostream> #include <vector> #inclu ...

  7. maven一直加载2.0.0.M7 的 config server 失败

    之前学习的时候使用F版的SpringBoot管理项目依赖一直好好的,今天不知idea为何抽疯,一直加载失败,各种重启,清除,没用 只能像之前学习注册consul 时将F版的SpringBoot 改为G ...

  8. python 变量的赋值【内存地址】

    注意: python所有的数据都是对象,变量只是指向一个对象的地址,一旦将变量的值或者类型改变,变量指向的地址就有可能发生变化 这个特性在使用默认参数的时候一定要注意

  9. 类欧几里得模板 p5170

    //类欧几里得的模板题 p5170 //求这三个式子: //第一个跟后两个没关联 //后两个跟其余两个都有关联: #include<cstdio> #include<algorith ...

  10. vnpy源码阅读学习(5):关于MainEngine的代码阅读

    关于MainEngine的代码阅读 在入口文件中,我们看到了除了窗体界面的产生,还有关于MainEngine和EventEngin部分.今天来学习下MainEngine的代码. 首先在run代码中,我 ...