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. 【MVC】视图页引用分部视图(WebForm叫做用户控件)

    方法一.不经过控制器.动作方法,直接返回Html @Html.Partial("Head","我可以给分布视图传数据") Head是Views/Shared/H ...

  2. (zxing.net)一维码EAN 8的简介、实现与解码

    一.简介 一维码EAN 8:属于国际标准条码,由8个数字组成,属EAN的简易编码形式(EAN缩短码).当包装面积小于120平方公分以下无法使用标准码时,可以申请使用缩短码. 依结构的不同,EAN条码可 ...

  3. deepin获取root权限

    ctrk+alt+t 打开终端 输入 sudo passwd root mywork@mywork-PC:~$ sudo passwd root[sudo] mywork 的密码: [sudo] 输入 ...

  4. GO语言官方中文教程!

    官方中文教程网址:https://tour.go-zh.org/basics/1 推荐理由:简洁,一句废话没有,对于初学者可以让大家快速掌握GO语言! 注意问题:如果不能访问,你懂的! 教程截图:

  5. Gogland配置- 修改Go源代码tab值

    Gogland对Go源代码默认值为8个,我很不习惯,第一次遇到tab数量这么大的,于是我决定修改这个tab值! 1,点击顶部菜单“File”->"Settings". 2,在 ...

  6. Lexicographical Substring Search (spoj7259) (sam(后缀自动机)+第k小子串)

    Little Daniel loves to play with strings! He always finds different ways to have fun with strings! K ...

  7. 洛谷P4250 [SCOI2015]小凸想跑步(半平面交)

    题面 传送门 题解 设\(p\)点坐标为\(x_p,y_p\),那么根据叉积可以算出它与\((i,i+1)\)构成的三角形的面积 为了保证\(p\)与\((0,1)\)构成的面积最小,就相当于它比其它 ...

  8. vue + ElementUI 表格筛选框的高度设置,超出一定高度,显示滚动条

    相信有很多小伙伴遇到过这个问题,首先还是来看图片,筛选框我做了处理,所以和官网的有点小差别 官方网站和个人网站对比图如下: 代码如下:(F12找到该元素的class,设置高度) .el-table-f ...

  9. 【FAQ】Maven 本地仓库明明有jar包,pom文件还是报错解决办法

    方法一: 找到出错的jar包文件位置,删掉_maven.repositories文件 方法二: maven中的本地仓库的index索引没有更新导致 解决方案: 在eclipse中打开菜单 window ...

  10. multiprocessor(下)

    一.数据共享 展望未来,基于消息传递的并发编程是大势所趋即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队列交换数据.这样极大地减少了对使用锁定和其他同步手段的需求,还可以扩展到分 ...