由于服务器是通过IServer接口表示的,所以可以将ASP.NET Core框架的核心视为由IServer和IHttpApplication对象组成的管道。...我们调用IApplicationBuilder接口的Run扩展方法注册了一个中间件,该中间件在处理请求时会利用表示当前请求上下文的HttpContext对象得到与之绑定的IServiceProvider...至于针对诊断日志消息的内容荷载(Payload)的结构,上述3类诊断事件具有两个相同的成员,分别是表示当前请求上下文的HttpContext和通过一个Int64整数表示的当前时间戳,对应的数据成员的名称分别为...在针对“结束请求”诊断事件的OnRequestEnd方法中,我们将这个时间戳从HttpContext上下文中提取出来,结合当前时间戳计算出请求处理耗时,该耗时和响应的状态码最终会被写入控制台。...在注册的EventWritten事件中,我们将监听到的事件名称的负载内容输出到控制台上。
要真正理解认证、登录与注销这3个核心操作的本质,就需要对ASP.NET Core采用的基于“票据”的认证机制有基本的了解。...在注册这些基础服务时,我们还设置了默认采用的认证方案,静态类型CookieAuthenticationDefaults的AuthenticationScheme属性返回的就是Cookie认证方案的默认方案名称...从如上所示的代码片段可以看出,我们仅仅调用当前HttpContext上下文的ChallengeAsync扩展方法就完成了针对登录路径的重定向。...图19-3还反映了一个细节,调用HttpContext上下文的ChallengeAsync方法会将当前路径(主页路径“/”,经过编码后为“%2F”)存储在一个名为ReturnUrl的查询字符串中,SignInAsync...如下面的代码片段所示,我们定义在Program中的SignOutAsync扩展方法正是调用这个方法来注销当前登录状态的。我们在完成注销之后将应用重定向到主页。
,这是标识了当前项目的内容,依赖,和配置信息等构建这个项目一切内容的一个 xml文档。...事实上,Web 项目的本质就是一个 Console 项目,在Main 中声明和创建了一个 IWebHost 来作为 ASP.NET Core 应用的核心,其中包含了配置信息,和Kestrel 服务。...Core有两个配置文件,上面我们也看到了,在Program.cs中进行了一些列的配置,同样,也注意到,后面使用了.UseStartup()来调用Startup.cs中的配置文件。...类/方法 使用基于环境的类:Startup{环境名称} StartupDevelopment StartupProduction StartupStaging 在Program里配置IWebHostBuilder...Uow 和 Repository模式 的关系即: 工作单元服务于仓储,并在工作单元中初始化上下文,为仓储单元提供上下文对象,由此确保同一上下文对象。
我们最后调用IApplicationBuilder接口的Run扩展方法注册了一个中间件,该中间件在处理请求时会利用依赖注入容器提取出用于发送日志事件的ILoggerProgram>对象,并利用它写入一条...至于针对诊断日志消息的内容荷载(Payload)的结构,上述三类诊断事件具有两个相同的成员,分别是表示当前请求上下文的HttpContext和通过一个Int64整数表示的当前时间戳,对应的数据成员的名称分别为...为了能够计算整个请求处理的耗时,它将当前时间戳保存在HttpContext上下文的Items集合中。...针对“结束请求”事件的OnRequestEnd方法将这个时间戳从HttpContext上下文中提取出来,结合当前时间戳计算出请求处理耗时,该耗时和响应的状态码最终会被写入控制台。...图2 利用注册的诊断监听器获取诊断日志 [S1703]收集EventSource输出的日志 HostingApplication在处理每个请求的过程中还会利用名称为“Microsoft.AspNetCore.Hosting
当一个Controller对象被激活之后,核心的操作就是根据请求上下文解析出目标Action方法,并通过Model绑定机制从请求上下文中提取相应的数据映射为方法的参数并最终执行Action方法。...其中TemplateData和ViewData具有基于字典的数据结构,Key和Value分别表示变量的名称和值,所不同的前者用于存储基于当前HTTP上下文的变量(在完成当前请求后,存储的数据会被回收)。...当ControllerBase的Execute方法被执行的时候,它会根据传入的ReuqestContext创建ControllerContext对象,而后续的操作可以看成是在该上下文中进行。...具体来说,如果该值为True或者不存在,则先通过当前ControllerBuilder的命名空间解析,如果失败则忽略命名空间直接采用类型名称进行匹配;否则直接因找不到匹配的Controller而抛出异常...通过《ASP.NET路由系统实现原理:HttpHandler的动态映射》介绍我们知道ASP.NET路由系统的核心是一个叫做UrlRoutingModule的自定义HttpModule,路由的实现是它通过注册代表当前
对于一个ASP.NET Core应用来说,Singleton和Scoped对应的是针对当前应用和当前请求的生命周期,所以通过IOptions接口获取的Options对象在整个应用的生命周期内都是一致的...,而通过IOptionsSnapshot接口获取的Options对象则只能在当前请求上下文中保持一致。...对象来提供服务,而是利用它创建了一个代表子容器的IServiceProvider对象,该对象就相当于ASP.NET Core应用中针对当前请求创建的IServiceProvider对象(RequestServices...这个特性决定了在一个ASP.NET Core应用中,以IOptions服务的形式提供的Options在整个应用的生命周期内不会发生改变,但是若使用IOptionsSnapshot服务,提供的Options对象只能在同一个请求上下文中提供一致的保障。
基于IHostBuilder/IHost的承载系统通过IHostEnvironment接口表示承载环境,我们利用它不仅可以得到当前部署环境的名称,还可以获知当前应用的名称和存放内容文件的根目录路径。...具体来说,每个委托对象都会绑定到一个方法上,而方法是定义在某个类型中的,该类型所在程序集的名称会默认作为应用的名称。...在默认情况下,针对应用名称的设置体现在如下所示的代码片段中。...根据不同的目的可以将同一个应用部署到不同的环境中,在不同环境中部署的应用往往具有不同的设置。在默认情况下,环境的名称为Production。...在默认情况下,由ContentRootPath属性表示的内容文件的根目录就是当前应用程序域的基础目录,也就是表示当前应用程序域的AppDomain对象的BaseDirectory属性返回的目录,静态类AppContext
一、初始化配置 当IWebHostBuilder对象被创建的时候,它会将当前的环境变量作为配置源来创建承载最初配置数据的IConfiguration对象,但它只会选择名称以“ASPNETCORE_”为前缀的环境变量...在ASP.NET Core应用中,我们可以通过调用定义在IWebHostBuilder接口的GetSetting方法和UseSetting方法达到相同的目的。...如果希望通过修改配置来控制ASP.NET Core框架的某些行为,就需要先知道对应的配置项的名称是什么。...包括端口在内的监听地址是通过名称为urls的配置项来控制的,如果记不住这个配置项的名称,也可以直接使用定义在WebHostDefaults中对应的只读属性ServerUrlsKey,该静态类型中还提供了其他一些预定义的配置项名称...如果设置与当前承载上下文无关,我们还可以调用ConfigureAppConfiguration方法重载,该方法的参数类型为Action。
这个由一个服务器和若干中间件构成的管道就是ASP.NET Core框架的核心,我们接下来的核心任务就是让大家搞清楚这个管道是如何被构建起来的,以及该管道采用怎样的请求处理流程。 ?...为此我们将ASP.NET Core最本质、最核心的部分提取出来,重新构建了一个迷你版的ASP.NET Core框架。 ? ASP.NET Core Mini具有如上所示的三大特点。...第三、为了让大家能够在最短的时间内理解ASP.NET Core框架的精髓,ASP.NET Core Mini必需足够简单,所以我们整个实现的核心代码不会超过200行。...对于某个中间件来说,当我们完成了自身的请求处理任务之后,在大部分情况下也需要将请求分发给后续的中间件。请求在服务器与中间件之间,以及在中间件之间的分发是通过共享上下文的方式实现的。 ?...如上图所示,当服务器接收到请求之后,会创建一个通过HttpContext表示的上下文对象,所有中间件都是在这个上下文中处理请求的,那么一个HttpContext对象究竟携带怎样的上下文信息呢?
这个由一个服务器和若干中间件构成的管道就是ASP.NET Core框架的核心,我们接下来的核心任务就是让大家搞清楚这个管道是如何被构建起来的,以及该管道采用怎样的请求处理流程。...为此我们将ASP.NET Core最本质、最核心的部分提取出来,重新构建了一个迷你版的ASP.NET Core框架。 ASP.NET Core Mini具有如上所示的三大特点。...第三、为了让大家能够在最短的时间内理解ASP.NET Core框架的精髓,ASP.NET Core Mini必需足够简单,所以我们整个实现的核心代码不会超过200行。...对于某个中间件来说,当我们完成了自身的请求处理任务之后,在大部分情况下也需要将请求分发给后续的中间件。请求在服务器与中间件之间,以及在中间件之间的分发是通过共享上下文的方式实现的。...如上图所示,当服务器接收到请求之后,会创建一个通过HttpContext表示的上下文对象,所有中间件都是在这个上下文中处理请求的,那么一个HttpContext对象究竟携带怎样的上下文信息呢?
步骤一、创建HostBuilderContext 由于很多依赖服务都是针对当前承载上下文进行注册的,所以Build方法首要的任务就是创建出作为承载上下文的HostBuilderContext对象。...在实现的StartAsync方法中,我们将与承载环境相关的环境名称、应用名称和内容文件根目录路径输出到控制台上。...如果不存在针对应用名称的配置项,应用名称将会设置为当前入口程序集的名称。...如果内容文件根目录路径对应的配置项不存在,当前应用的基础路径(AppContext.BaseDirectory)将会作为内容文件根目录路径。...通过这个ConfigurationBuilder对象创建的IConfiguration对象将会重新赋值给HostBuilderContext对象的Configuration属性,我们自此就可以从承载上下文中得到完整的配置了
我个人觉得这是ASP.NET Core MVC框架体系最核心的部分。...MVC框架针对这种需求大都采用如图3所示模式来实现:Foo先创建一个上下文,并提供必要的输入,然后驱动每个Bar对象在这个上下文中完成各自的处理任务。...所有Bar对象针对数据和状态的修改,以及产生的输出均体现在这个共享的上下文中,所有对象最终通过这个上下文就可以得到应有的状态或者所需的输出。...如图4所示,在创建共享上下文之后,Foo对象先按序执行每一个Bar对象的Executing操作,最后再反向执行每个Bar对象的Executed操作,所有的操作均在同一个上下文中执行。...上下文中提取出来,并将各种方式注册的约定应用在该对象上,具体的实现体现在如下这个ApplyConventions方法上。
一、在Startup类型的构造函数中注入 构成HostBuilderContext上下文的两个核心对象(表示配置的IConfiguration对象和表示承载环境的IHostEnvironment对象)可以直接注入...和HttpContext,对于该参数在整个参数列表的位置,前两者都未做任何限制,只有后者要求表示当前请求上下文的参数HttpContext必须作为方法的第一个参数。...Scoped服务只能注入中间件类型的InvokeAsync方法中,因为依赖服务是在针对当前请求的服务范围中提供的,所以能够确保Scoped服务在当前请求处理结束之后被释放。...五、在Controller类型的构造函数中注入 在一个ASP.NET Core MVC应用中,我们可以在定义的Controller中以构造函数注入的方式注入所需的服务。...= null); } } 七、在视图中注入 在ASP.NET Core MVC应用中,我们还可以将服务注册到现的View中。
,在它的生命周期内维护着它里面的所有对象,确保在同一个生命周期内对象池里的数据的唯一性。当对象池被销毁时,它里面的所有对象也将跟着销毁。...对象池的种类 根据生命周期的不同,可分为不同种类的对象池,KT目前共有以下几种: A、WebApplicationObjectPool: 基于ASP.NET 应用程序的对象池 对于同一个ASP.NET...此对象池可以在ASP.NET和Application环境下使用。 对于同一个线程来说,对象池里的数据是共用的。...KT里提供一个当前上下文的对象池调用“ObjectPoolContext”,此对象会自动根据您所处的上下文环境,调用对应的对象池实例。...比如你当前的程序是运行在ASP.NET Web环境下,则会调用WebRequestObjectPool而如果是在Application环境下则会调用ThreadCallObjectPool对象池,如下示例代码
三.WebApi核心对象ApiController: 在我们的asp.net webapi项目中,在顶层目录App_Start下,有一个WebApiConfig类,该类只包含一个方法Register...ApiController是ValuesController类的父类,是整个ASP.NET Web API的核心类,继承该类可以用来创建ASP.NET Web API控制器。...Request:获取或设置当前 ApiController 的 HttpRequestMessage; RequestContext: 获取请求上下文; Url:用于生成指向其他...//参数:controllerContext:测试控制器的当前上下文。cancellationToken:取消操作的通知。 //返回结果:控制器。...如果文中有不足和讲解错误之处,还望大家多多指正。
在此次分享中,我按照ASP.NET Core自身的运行原理和设计思想创建了一个 “迷你版” 的ASP.NET Core框架,并且利用这个 “极简” 的模拟框架阐述了ASP.NET Core框架最核心、最本质的东西...整个框架涉及到的核心代码不会超过200行,涉及到7个核心的对象。由于ASP.NET Core 3.X采用了不同的应用承载方式,所以我们将这个模拟框架升级到3.x版本。...为了能够在真实框架中找到对应物,在定义接口或者类型时会采用真实的名称,但是在API的定义上会做最大限度的简化。 HttpContext 一个HttpContext对象表示针对当前请求的上下文。...如下图所示,当服务器接收到请求之后,会创建一个通过HttpContext表示的上下文对象,所有中间件都在这个上下文中完成针对请求的处理工作。...我们可以将请求和响应理解为一个Web应用的输入与输出,既然HttpContext上下文是针对请求和响应的封装,那么应用程序就可以利用这个上下文对象得到当前请求所有的输入信息,也可以利用它完成我们所需的所有输出工作
WebHostBuilderContext代表当前IWebHostBuilder在构建WebHost过程中采用的上下文,我们可以利用它得到当前应用的配置和与承载环境相关的信息。...二、服务的消费 ASP.NET Core框架中的很多核心对象都是通过依赖注入方式提供的,如用来对应用进行初始化的Startup对象、中间件对象,以及ASP.NET Core MVC应用中的Controller...在Startup中注入服务 构成HostBuilderContext上下文的两个核心对象(表示配置的IConfiguration对象和表示承载环境的IHostEnvironment对象)可以直接注入Startup...和HttpContext,对于该参数在整个参数列表的位置,前两者都未做任何限制,只有后者要求表示当前请求上下文的参数HttpContext必须作为方法的第一个参数。...表示当前请求上下文的HttpContext类型具有如下所示的RequestServices属性,它返回的就是这个针对当前请求的IServiceProvider对象。
有人认为浏览器上虽然没有显示任何详细的错误信息,但这并不意味着HTTP响应报文中也没有携带任何详细的出错信息。实际上,针对通过浏览器发出的这个请求,服务端会返回如下这段HTTP响应报文。...开发者异常页面除了显示与抛出的异常相关的信息,还会以图16-3所示的形式显示与当前请求上下文相关的信息,其中包括当前请求URL携带的所有查询字符串、所有请求报头、Cookie的内容和路由信息(终结点和路由参数...app.UseDeveloperExceptionPage(); } } } 二、显示定制异常页面 DeveloperExceptionPageMiddleware中间件会将异常详细信息和基于当前请求的上下文直接呈现在错误页面中...这个所谓的状态码错误处理器体现为一个Func类型的委托对象,作为输入的StatusCodeContext对象是对HttpContext上下文的封装,它同时承载着其他一些与错误处理相关的选项设置...当我们利用浏览器访问这个应用的时候,显示的错误消息将以下图所示的形式由响应状态码来决定。 ? 在ASP.NET Core的世界里,针对请求的处理总是体现为一个RequestDelegate对象。
一个ASP.NET Core应用的核心就是由一个服务器和一组有序中间件组成的请求处理管道,服务器只负责监听、接收和分发请求,以及最终完成对请求的响应,所以一个ASP.NET Core应用针对请求的处理能力和处理方式由注册的中间件来决定...一个ASP.NET Core在启动过程中的核心工作就是注册中间件,本节主要介绍应用启动过程中以中间件注册为核心的初始化工作。...由此可以看出,当ASP.NET Core框架从启动程序集中定位Startup类型时会优先选择类型名称与当前环境名称相匹配的。为了使读者对这个选择策略有更加深刻的认识,下面做一个实例演示。...我们采用命令行的形式多次启动App应用,并以命令行参数的形式指定启动程序集名称和当前环境名称,控制台上呈现的输出结果如下图所示。...当前应用名称会作为默认的IHostingStartup程序集进行注册,如果针对IHostingStartup类型的注册定义在该程序集中,就不需要对该程序集进行显式配置。