ASP .NET Core 的运行机制

  1. Web Server: ASP.NET Core 提供两种服务器可用, 分别是 Kestrel 和 HTTP.sys (Core 1.x 中被命名为 WebListener),

    • Kestrel是一个跨平台的Web服务器。
    • HTTP.sys只能用在Windows系统中.
  2. Internet: 当需要部署在Internal Network 中并需要 Kestrel 中没有的功能(如 Windows 身份验证)时,可以选择HTTP.sys。
  3. IIS、Apache、Nginx: Kestrel 可以单独使用 ,也可以将其与反向代理服务器(如 IIS、Nginx 或 Apache)结合使用。 请求经这些服务器进行初步处理后转发给Kestrel(即图中虚线的可选流程).

ASP .NET Core 的启动

public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
} public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
  1. Main: 程序的起点. ASP .NET Core 应用程序本质上是控制台应用程序。
  2. CreateDefaultBuilder:创建并配置WebHostBuilder, 首先调用Create­DefaultBuilder( 如图所示, 它是一系列配置的大综合,下文做详细介绍), 进行一系列配置。
  3. UseStartup: 指定Startup为启动配置文件. 在Startup中, 将进行两个比较重要的工作, 服务的依赖注入和配置管道。
    1. ConfigureServices方法是注册服务
    2. Configure方法是配置管道,用来具体指定如何处理每个http请求的, 例如我们可以让这个程序知道我使用mvc来处理http请求, 那就调用app.UseMvc()这个方法就行.
  4. BuildWebHost:生成WebHostBuilder并进行了一系列配置之后, 通过这个WebHostBuilder来Build出一个IWebHost。
  5. Run:调用IWebHost的Run方法使之开始运行。

Create­DefaultBuilder

public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
var builder = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment; config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true); if (env.IsDevelopment())
{
var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
if (appAssembly != null)
{
config.AddUserSecrets(appAssembly, optional: true);
}
} config.AddEnvironmentVariables(); if (args != null)
{
config.AddCommandLine(args);
}
})
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
})
.UseIISIntegration()
.UseDefaultServiceProvider((context, options) =>
{
options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
}); return builder;
}
  • UseKestrel 指定服务器使用 Kestrel,若使用HttpSys,需使用UseHttpSys。
  • UseContentRoot 指定根目录
  • ConfigureAppConfiguration 读取配置文件
  • ConfigureLogging 配置日志处理程序
  • UseIISIntegration 将应用程序配置为在 IIS 中运行。如果应用程序没有使用 IIS 作为反向代理,那么 UseIISIntegration 不会有任何效果。因此,即使应用程序在非 IIS 方案中运行,也可以安全调用这种方法。
  • UseDefaultServiceProvider 设置默认的依赖注入容器。

ASP .NET Core 的管道和中间件

请求管道: 那些处理http requests并返回responses的代码组成了request pipeline(请求管道).

中间件: 我们可以使用一些程序来配置请求管道(request pipeline)以便处理requests和responses. 比如处理验证(authentication)的程序, MVC本身就是个中间件(middleware).

当接收到一个请求时,请求会交给中间件构成的中间件管道进行处理,管道就是多个中间件构成,请求从一个中间件的一端进入,从中间件的另一端出来,每个中间件都可以对HttpContext请求开始和结束进行处理.

自己写一个中间件测试下:

  1. 通过约定方法实现:

    public class Floor1Middleware
    {
    private readonly RequestDelegate _next; public Floor1Middleware(RequestDelegate next)
    {
    _next = next;
    } public async Task InvokeAsync(HttpContext context)
    {
    Console.WriteLine("Floor1Middleware In");
    //Do Something
    //To FloorTwoMiddleware
    await _next(context);
    //Do Something
    Console.WriteLine("Floor1Middleware Out");
    }
    }

    添加扩展方法:

    public static class Floor1MiddlewareExtensions
    {
    public static IApplicationBuilder UseFloor1Middleware(this IApplicationBuilder builder)
    {
    return builder.UseMiddleware<Floor1Middleware>();
    }
    }
  2. 通过 IMiddleware 实现

    public class Floor3Middleware : IMiddleware
    {
    public async Task InvokeAsync(HttpContext context, RequestDelegate next)
    {
    Console.WriteLine("Floor3Middleware In");
    //Do Something
    //To FloorTwoMiddleware
    await next(context);
    //Do Something
    Console.WriteLine("Floor3Middleware Out");
    }
    }
    public static class MiddlewareExtensions
    {
    public static IApplicationBuilder UseFloor3Middleware(
    this IApplicationBuilder builder)
    {
    return builder.UseMiddleware<Floor3Middleware>();
    }
    }
    public void ConfigureServices(IServiceCollection services)
    {
    services.AddTransient<Floor3Middleware>(); services.AddMvc();
    }
  3. 也可以用简要的写法,直接在Startup的Configure方法中这样写:

    app.Use(async (context, next) =>
    {
    Console.WriteLine("Floor2Middleware In"); await next.Invoke(); Console.WriteLine("Floor2Middleware Out");
    });
  4. 测试中间件:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
    app.UseFloor1Middleware(); app.Use(async (context, next) =>
    {
    Console.WriteLine("Floor2Middleware In"); await next.Invoke(); Console.WriteLine("Floor2Middleware Out");
    }); if (env.IsDevelopment())
    {
    app.UseDeveloperExceptionPage();
    }
    else
    {
    app.UseExceptionHandler("/Home/Error");
    } app.UseStaticFiles();
    app.UseCookiePolicy(); app.UseMvc(routes =>
    {
    routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index}/{id?}");
    });
    }

    运行查看输出为:

    DIDemo> Floor1Middleware In
    DIDemo> Floor2Middleware In
    DIDemo> Floor3Middleware In
    DIDemo> info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
    DIDemo> Route matched with {action = "Index", controller = "Home"}. Executing action DIDemo.Controllers.HomeController.Index (DIDemo)
    DIDemo> info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
    DIDemo> Executing action method DIDemo.Controllers.HomeController.Index (DIDemo) - Validation state: Valid
    DIDemo> info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
    DIDemo> Executed action method DIDemo.Controllers.HomeController.Index (DIDemo), returned result Microsoft.AspNetCore.Mvc.ViewResult in 0.1167ms.
    DIDemo> info: Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor[1]
    DIDemo> Executing ViewResult, running view Index.
    DIDemo> info: Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor[4]
    DIDemo> Executed ViewResult - view Index executed in 3.3508ms.
    DIDemo> info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
    DIDemo> Executed action DIDemo.Controllers.HomeController.Index (DIDemo) in 9.5638ms
    DIDemo> Floor3Middleware Out
    DIDemo> Floor2Middleware Out
    DIDemo> Floor1Middleware Out

参考

ASP.NET Core 的启动和运行机制的更多相关文章

  1. 如何在ASP.NET Core程序启动时运行异步任务(3)

    原文:Running async tasks on app startup in ASP.NET Core (Part 3) 作者:Andrew Lock 译者:Lamond Lu 之前我写了两篇有关 ...

  2. 如何在ASP.NET Core程序启动时运行异步任务(1)

    原文:Running async tasks on app startup in ASP.NET Core (Part 1) 作者:Andrew Lock 译者:Lamond Lu 背景 当我们做项目 ...

  3. 如何在ASP.NET Core程序启动时运行异步任务(2)

    原文:Running async tasks on app startup in ASP.NET Core (Part 2) 作者:Andrew Lock 译者:Lamond Lu 在我的上一篇博客中 ...

  4. 在 ASP.NET Core 程序启动前运行你的代码

    一.前言 在进行 Web 项目开发的过程中,可能会存在一些需要经常访问的静态数据,针对这种在程序运行过程中可能几乎不会发生变化的数据,我们可以尝试在程序运行前写入到缓存中,这样在系统后续使用时就可以直 ...

  5. ASP.NET CORE做的网站运行在docker实践

    用VS2017 建立了 DotNet Core 2.2 的网站后,如何转移到 Docker 下运行? 下面分两种方式来实践: 1.直接手动命今行,将本机目录映射进Docker,运行网站.2.制作 Im ...

  6. 记一次asp.net core 在iis上运行抛出502.5错误

    asp.net core 在iis上运行抛出502.5异常的部分原因以及解决方案 环境说明 已安装 .net core runtime 2.1.401 已安装 .net core windows ho ...

  7. 01 ASP.NET Core 3 启动过程(一)

    ASP.NET Core 3 启动过程(一) 最近又忙于各种扯淡,今天来一个需求,明天又来一个需求,后天需求又变了,这可能是很多人遇到的情况.正在紧张的忙碌着,突然一个信息把所有计划打乱了," ...

  8. 一题多解,ASP.NET Core应用启动初始化的N种方案[下篇]

    [接上篇]"天下大势,分久必合,合久必分",ASP.NET应用通过GenericWebHostService这个承载服务被整合到基于IHostBuilder/IHost的服务承载系 ...

  9. 微服务中的健康监测以及其在ASP.NET Core服务中实现运行状况检查

    1 .什么是健康检查? 健康检查几乎就是名称暗示的.它是一种检查您的应用程序是否健康的方法.随着越来越多的应用程序转向微服务式架构,健康检查变得尤其重要(Health Check).虽然微服务架构有很 ...

随机推荐

  1. 使用C语言实现线性表

    线性表是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列,序列中的每个数据元素,可以是一个数字,可以是一个字符,也可以是复杂的结构体或对象.例如:1,2,3,4,5是一个线性表,A,B ...

  2. angular 响应式表单指令

    响应式表单都是以 form开头的指令 第一列指令(不以name结尾)在html模版中,用 [ ] 第二列指令(以name结尾)在html模版中,不用 [ ]

  3. Python实现简单登陆验证(文件操作)

    利用python编写一个简单的登陆验证 代码主要功能: 利用Python实现简单的登陆验证,代码主要有两个部分组成: 第一部分:登陆页面,作用是实现用户名和密码的输入 利用两个输入函数input()来 ...

  4. 从0开始学习Unity的学习笔记(I 界面学习和简单模型拼装)

    先给一个大致今天学习的图,然后后面是细节 1.下载Unity :官网下载需要版本 2.Unity安装:一定不要有中文路径:一台电脑可以安装不同版本的Unity,但是要安装在不同的文件夹下: 3. 新建 ...

  5. 「BZOJ1426」收集邮票

    题目链接 戳我 \(Solution\) 我们首先转换一下问题: 假设我们进行了k轮得到了所有种类的邮票 则所花费用为: \[(1+2+5+...+k)=\frac{(1+k)*k}{2}=\frac ...

  6. iOS 模拟器网络设置

    在 iOS Simulator 下,点上面菜单栏最左面的苹果标志,第三项 网络设置,然后先最后面一项,网络设置. 然后在网络设置界面下可以开启或关闭网络.

  7. 修改 nginx 默认端口

     修改 nginx 默认端口 nginx 解压目录下的  conf 目录下的 nginx.conf 修改对应端口

  8. python中的基本数据类型(int,bool,str)及字符串操作

    一. 基本数据类型概况 1.  int 整数,主要用来进行数学运算 2.  str 字符串,可以保存少量数据并进行相应的操作 3.  bool 布尔值,判断真假,True,False 4.  list ...

  9. C# Winform 小技巧(Datagridview某一列按状态显示不同图片)

    步骤: 一.导入状态图片到项目中: 二.在窗体中声明一个图片数组,并在窗体的OnLoad事件中加入图片资源: /// <summary> /// 存储状态图片序列,避免同一状态对图片重复读 ...

  10. docker启动时报错

    docker安装成功后,启动时报错. 1.后来排查后发现yum install docker安装的是从test存储库中安装的. 后来我指定了特定的版本后,而且从stable存储库安装的,以后再启动就好 ...