摘要:之前写了一系列关于ASP.NET Core的文章,现在将它们进行的分类整理。在博客停更了几个月之后,我决定继续对这个系列进行完善,旨在打造一个全网最系统、深入的ASP.NET Core知识库。本系列的大部分内容来源于《ASP.NET Core 3框架解析》(有修改),也会包含一些新的内容。 阅读全文
posted @ 2020-11-10 08:12 Artech 阅读(5859) 评论(15) 推荐(32) 编辑
摘要:《ASP.NET Core 3框架揭秘》于本月19日在下午京东正式开始预售,并在半天之内销售近一千套,随后迅速占据京东科技IT图书畅销榜榜首的位置。为期一周的限时五折优惠将在今天24时结束。有兴趣的朋友可以加入本书读者群购买。 阅读全文
posted @ 2020-03-20 12:22 Artech 阅读(12814) 评论(58) 推荐(26) 编辑
摘要:StatusCodePagesMiddleware中间件与ExceptionHandlerMiddleware中间件类似,它们都是在后续请求处理过程中“出错”的情况下利用一个错误处理器来接收针对当前请求的处理。它们之间的差异在于对“错误”的认定上:ExceptionHandlerMiddleware中间件所谓的错误就是抛出异常;StatusCodePagesMiddleware中间件则将400~599的响应状态码视为错误。 阅读全文
posted @ 2021-01-22 09:38 Artech 阅读(479) 评论(3) 推荐(6) 编辑
摘要:DeveloperExceptionPageMiddleware中间件错误页面可以呈现抛出的异常和当前请求上下文的详细信息,以辅助开发人员更好地进行纠错诊断工作。ExceptionHandlerMiddleware中间件则主要面向最终用户,我们可以利用它来显示一个友好的定制化错误页面。 阅读全文
posted @ 2021-01-21 10:16 Artech 阅读(1521) 评论(7) 推荐(13) 编辑
摘要:异常页面的DeveloperExceptionPageMiddleware中间件,该中间件在捕捉到后续处理过程中抛出的异常之后会返回一个媒体类型为text/html的响应,后者在浏览器上会呈现一个错误页面。由于这是一个为开发者提供诊断信息的异常页面,所以可以将其称为开发者异常页面(Developer Exception Page)。该页面不仅会呈现异常的详细信息(类型、消息和跟踪堆栈等),还会出现与当前请求相关的上下文信息 阅读全文
posted @ 2021-01-19 10:15 Artech 阅读(438) 评论(0) 推荐(5) 编辑
摘要:NuGet包“Microsoft.AspNetCore.Diagnostics”中提供了几个与异常处理相关的中间件。当ASP.NET Core应用在处理请求过程中出现错误时,我们可以利用它们将原生的或者定制的错误信息作为响应内容发送给客户端。在着重介绍这些中间件之前,下面先演示几个简单的实例,从而使读者大致了解这些中间件的作用。 阅读全文
posted @ 2021-01-18 09:49 Artech 阅读(601) 评论(0) 推荐(5) 编辑
摘要:AOP的本质是方法拦截(将针对目标方法调用劫持下来,进而执行执行的操作),置于方法拦截的实现方案,不外乎两种代码注入类型,即编译时的静态注入和运行时的动态注入,本篇文章列出了几种常用的动态注入方案。这篇文章的目标并不是提供完整的AOP框架的解决方案,而是说明各种解决方案后面的原理,所以我们提供的实例代码会尽可能简单 阅读全文
posted @ 2021-01-11 09:44 Artech 阅读(2704) 评论(19) 推荐(23) 编辑
摘要:表示路由终结点的RouteEndpoint对象包含以RoutePattern对象表示的路由模式,某个请求能够被成功路由的前提是它满足某个候选终结点的路由模式所体现的路由规则。具体来说,这不仅要求当前请求的URL路径必须满足路由模板指定的路径模式,还需要具体的字符内容满足对应路由参数上定义的约束。 阅读全文
posted @ 2021-01-08 09:41 Artech 阅读(945) 评论(0) 推荐(4) 编辑
摘要:针对终结点的路由是由EndpointRoutingMiddleware和EndpointMiddleware这两个中间件协同完成的。应用在启动之前会注册若干表示终结点的Endpoint对象(具体来说是包含路由模式的RouteEndpoint对象)。当应用接收到请求并创建HttpContext上下文之后,EndpointRoutingMiddleware中间件会根据请求的URL及其他相关信息从注册的终结点中选择匹配度最高的那个。之后被选择的终结点会以一个特性(Feature)的形式附加到当前HttpContext上下文中,EndpointMiddleware中间件最终提供这个终结点并用它来处理当前请求。[ 阅读全文
posted @ 2021-01-07 08:44 Artech 阅读(447) 评论(3) 推荐(10) 编辑
摘要:本章介绍的是最早发布于ASP.NET Core 2.2中的新路由系统,由于它采用基于终结点映射的策略,所以我们将其称为终结点路由。终结点路由自然以终结点为核心,所以先介绍终结点在路由系统中的表现形式。 阅读全文
posted @ 2021-01-06 10:11 Artech 阅读(640) 评论(0) 推荐(5) 编辑
摘要:一个Web应用本质上体现为一组终结点的集合。终结点则体现为一个暴露在网络中可供外界采用HTTP协议调用的服务,路由的作用就是建立一个请求URL模式与对应终结点之间的映射关系。借助这个映射关系,客户端可以采用模式匹配的URL来调用对应的终结点。对于路由系统来说,作为路由目标的终结点总是关联一个具体的URL路径模式,我们将其称为路由模式(Route Pattern)。 阅读全文
posted @ 2021-01-05 08:44 Artech 阅读(595) 评论(1) 推荐(9) 编辑
摘要:借助路由系统提供的请求URL模式与对应终结点(Endpoint)之间的映射关系,我们可以将具有相同URL模式的请求分发给应用的终结点进行处理。ASP.NET Core的路由是通过EndpointRoutingMiddleware和EndpointMiddleware这两个中间件协作完成的,它们在ASP.NET Core平台上具有举足轻重的地位,因为ASP.NET Core MVC框架就建立在这个中间件之上。 阅读全文
posted @ 2021-01-04 08:59 Artech 阅读(696) 评论(2) 推荐(5) 编辑
摘要:对于NuGet包由“Microsoft.AspNetCore.StaticFiles”提供的3个中间件来说,StaticFileMiddleware中间件旨在处理针对具体静态文件的请求,其他两个中间件(DirectoryBrowserMiddleware和DefaultFilesMiddleware)处理的均是针对某个目录的请求。 阅读全文
posted @ 2020-12-21 08:59 Artech 阅读(370) 评论(0) 推荐(5) 编辑
摘要:上面的实例演示(搭建文件服务器、条件请求以提升性能和区间请求以提供部分内容)从提供的功能和特性的角度对StaticFileMiddleware中间件进行了全面的介绍,下面从实现原理的角度对这个中间件进行全面解析。 阅读全文
posted @ 2020-12-18 09:09 Artech 阅读(584) 评论(1) 推荐(5) 编辑
摘要:大部分针对物理文件的请求都希望获取整个文件的内容,区间请求则与之相反,它希望获取某个文件部分区间的内容。区间请求可以通过多次请求来获取某个较大文件的全部内容,并实现断点续传。如果同一个文件同时存放到多台服务器,就可以利用区间请求同时下载不同部分的内容。与条件请求一样,区间请求也作为标准定义在HTTP规范之中。 阅读全文
posted @ 2020-12-17 09:17 Artech 阅读(433) 评论(0) 推荐(4) 编辑
摘要:StaticFileMiddleware中间件最终利用IFileProvider对象读取文件的内容,并将其作为响应报文的主体。实际上,这个中间件在处理请求时所做的事情比前面的演示实例多,比如针对条件请求(Conditional Request)和区间请求(Range Request)的处理就没有体现在上面演示的实例中。 阅读全文
posted @ 2020-12-16 10:57 Artech 阅读(732) 评论(2) 推荐(4) 编辑
摘要:虽然ASP.NET Core是一款“动态”的Web服务端框架,但是由它接收并处理的大部分是针对静态文件的请求,最常见的是开发Web站点使用的3种静态文件(JavaScript脚本、CSS样式和图片)。ASP.NET Core提供了3个中间件来处理针对静态文件的请求,利用它们不仅可以将物理文件发布为可以通过HTTP请求获取的Web资源,还可以将所在的物理目录的结构呈现出来。 阅读全文
posted @ 2020-12-15 08:53 Artech 阅读(2944) 评论(14) 推荐(23) 编辑
摘要:要承载一个ASP.NET Core应用,只需要将GenericWebHostService服务注册到承载系统中即可。但GenericWebHostService服务具有针对其他一系列服务的依赖,所以在注册该承载服务之前需要先完成对这些依赖服务的注册。针对GenericWebHostService及其依赖服务的注册是借助GenericWebHostBuilder对象来完成的。 阅读全文
posted @ 2020-12-03 09:00 Artech 阅读(516) 评论(0) 推荐(7) 编辑
摘要:我们知道ASP.NET Core应用的请求处理管道是由一个IServer对象和IHttpApplication对象构成的。我们可以根据需要注册不同类型的服务器,但在默认情况下,IHttpApplication是一个HostingApplication对象。一个HostingApplication对象由指定的RequestDelegate对象来完成所有的请求处理工作,而后者代表所有中间件按照注册的顺序串联而成的委托链。所有的这一切都被GenericWebHostService整合在一起. 阅读全文
posted @ 2020-12-02 09:17 Artech 阅读(658) 评论(0) 推荐(4) 编辑
摘要:ASP.NET Core应用默认的请求处理管道是由注册的IServer对象和HostingApplication对象组成的,后者利用一个在创建时提供的RequestDelegate对象来处理IServer对象分发给它的请求。而RequestDelegate对象实际上是由所有的中间件按照注册顺序创建的。换句话说,这个RequestDelegate对象是对中间件委托链的体现。 阅读全文
posted @ 2020-11-30 09:00 Artech 阅读(756) 评论(0) 推荐(7) 编辑
摘要:在前两篇文章中,我们先后介绍了CallContext(IllogicalCallContext和LogicalCallContext)、AsyncLocal和SynchronizationContext,它们都是线程执行上下文的一部分。本篇介绍的安全上下文(SecurityContext)同样是执行上下文的一部分,它携带了的身份和权限相关的信息决定了执行代码拥有的控制权限。 阅读全文
posted @ 2020-11-27 09:04 Artech 阅读(2732) 评论(5) 推荐(11) 编辑
摘要:一般情况下,我们可以将某项操作分发给任意线程来执行,但有的操作确实对于执行的线程是有要求的,最为典型的场景就是:GUI针对UI元素的操作必须在UI主线程中执行。将指定的操作分发给指定线程进行执行的需求可以通过同步上下文(SynchronizationContext)来实现。你可能从来没有使用过SynchronizationContext,但是在基于Task的异步编程中,它却总是默默存在。今天我们就来认识一下这个SynchronizationContext对象。 阅读全文
posted @ 2020-11-26 08:38 Artech 阅读(1129) 评论(4) 推荐(13) 编辑
摘要:线程是操作系统能够进行运算调度的最小单位,操作系统线程进一步被封装成托管的Thread对象,手工创建并管理Thread对象已经成为了所能做到的对线程最细粒度的控制了。后来我们有了ThreadPool,可以更加方便地以池化的方式来使用线程。最后,Task诞生,它结合async/await关键字给与我们完美异步编程模式。但这一切让我们的编程体验越来越好,但是离线程的本质越来越远。被系列文章从“执行上下文传播”这个令开发者相对熟悉的角度来聊聊重新认识我们似乎已经很熟悉的主题。 阅读全文
posted @ 2020-11-25 09:26 Artech 阅读(2209) 评论(8) 推荐(23) 编辑
摘要:ASP.NET Core的请求处理管道由一个服务器和一组中间件构成,但对于面向传输层的服务器来说,它其实没有中间件的概念。当服务器接收到请求之后,会将该请求分发给一个处理器进行处理,对服务器而言,这个处理器就是一个HTTP应用,此应用通过IHttpApplication接口来表示。由于服务器是通过IServer接口表示的,所以可以将ASP.NET Core框架的核心视为由IServer和IHttpApplication对象组成的管道 阅读全文
posted @ 2020-11-24 09:14 Artech 阅读(683) 评论(3) 推荐(6) 编辑
摘要:ASP.NET Core请求处理管道由一个服务器和一组有序排列的中间件构成,所有中间件针对请求的处理都在通过HttpContext对象表示的上下文中进行。由于应用程序总是利用服务器来完成对请求的接收和响应工作,所以原始请求上下文的描述由注册的服务器类型来决定。但是ASP.NET Core需要在上层提供具有一致性的编程模型,所以我们需要一个抽象的、不依赖具体服务器类型的请求上下文描述,这就是本章着重介绍的HttpContext。 阅读全文
posted @ 2020-11-23 08:53 Artech 阅读(933) 评论(3) 推荐(6) 编辑
摘要:一个ASP.NET Core应用的核心就是由一个服务器和一组有序中间件组成的请求处理管道,服务器只负责监听、接收和分发请求,以及最终完成对请求的响应,所以一个ASP.NET Core应用针对请求的处理能力和处理方式由注册的中间件来决定。一个ASP.NET Core在启动过程中的核心工作就是注册中间件,本节主要介绍应用启动过程中以中间件注册为核心的初始化工作。 阅读全文
posted @ 2020-11-20 08:55 Artech 阅读(937) 评论(0) 推荐(3) 编辑
摘要:HeaderForwarder组件不仅能够从当前接收请求提取指定的HTTP报头,并自动将其添加到任何一个通过HttpClient发出的请求中,它同时也提供了一种基于Context/ContextScope的编程模式是我们可以很方便地将任何报头添加到指定范围内的所有由HttpClient发出的请求中。 阅读全文
posted @ 2020-11-19 08:54 Artech 阅读(815) 评论(0) 推荐(5) 编辑
摘要:如今的应用部署逐渐向微服务化发展,导致一个完整的事务往往会跨越很多的应用或服务,出于分布式链路跟踪的需要,我们往往将从上游服务获得的跟踪请求报头无脑地向下游服务进行转发。本文介绍的这个名为HeaderForwarder的组件可以帮助我们完成针对指定HTTP请求报头的自动转发。 阅读全文
posted @ 2020-11-18 08:55 Artech 阅读(1318) 评论(2) 推荐(9) 编辑
摘要:我们知道“依赖注入”已经成为了.NET Core的基本编程模式,表示当前请求上下文的HttpContext可以通过注入的IHttpContextAccessor服务来提取。有时候我们会使用一些由于某些原因无法使用依赖注入的组件,我们如何提取当前HttpContext呢? 阅读全文
posted @ 2020-11-17 10:26 Artech 阅读(1879) 评论(3) 推荐(7) 编辑
摘要:基于IHostBuilder/IHost的承载系统通过IHostEnvironment接口表示承载环境,我们利用它不仅可以得到当前部署环境的名称,还可以获知当前应用的名称和存放内容文件的根目录路径。对于一个Web应用来说,我们需要更多的承载环境信息,额外的信息定义在IWebHostEnvironment接口中。 阅读全文
posted @ 2020-11-16 08:56 Artech 阅读(2099) 评论(1) 推荐(11) 编辑
摘要:IHostBuilder接口中定义了ConfigureHostConfiguration方法和ConfigureAppConfiguration方法,它们可以帮助我们设置面向宿主(IHost对象)和应用(承载服务)的配置。针对配置的初始化也可以借助IWebHostBuilder接口来完成。 阅读全文
posted @ 2020-11-13 08:45 Artech 阅读(668) 评论(1) 推荐(3) 编辑
摘要:基于IHostBuilder/IHost的服务承载系统建立在依赖注入框架之上,它在服务承载过程中依赖的服务(包括作为宿主的IHost对象)都由代表依赖注入容器的IServiceProvider对象提供。在定义承载服务时,也可以采用依赖注入方式来消费它所依赖的服务。作为依赖注入容器的IServiceProvider对象能否提供我们需要的服务实例,取决于相应的服务注册是否预先添加到依赖注入框架中。 阅读全文
posted @ 2020-11-12 08:46 Artech 阅读(2484) 评论(11) 推荐(9) 编辑
摘要:HTTP协议自身的特性决定了任何一个Web应用的工作模式都是监听、接收并处理HTTP请求,并且最终对请求予以响应。HTTP请求处理是管道式设计典型的应用场景:可以根据具体的需求构建一个管道,接收的HTTP请求像水一样流入这个管道,组成这个管道的各个环节依次对其做相应的处理。 阅读全文
posted @ 2020-11-11 08:46 Artech 阅读(1073) 评论(3) 推荐(9) 编辑
摘要:之前写了一系列关于ASP.NET Core的文章,现在将它们进行的分类整理。在博客停更了几个月之后,我决定继续对这个系列进行完善,旨在打造一个全网最系统、深入的ASP.NET Core知识库。本系列的大部分内容来源于《ASP.NET Core 3框架解析》(有修改),也会包含一些新的内容。 阅读全文
posted @ 2020-11-10 08:12 Artech 阅读(5859) 评论(15) 推荐(32) 编辑
摘要:昨天有个朋友在微信上问我一个问题:他希望通过动态脚本的形式实现对ASP.NET Core MVC应用的扩展,比如在程序运行过程中上传一段C#脚本将其中定义的Controller类型注册到应用中,问我是否有好解决方案。这是一个挺有意思的问题,我们可以通过两种方案实现了这个需求。 阅读全文
posted @ 2020-04-07 09:29 Artech 阅读(5768) 评论(14) 推荐(33) 编辑
摘要:《ASP.NET Core 3框架揭秘》勘误表 阅读全文
posted @ 2020-04-04 18:37 Artech 阅读(4406) 评论(70) 推荐(12) 编辑
摘要:传统的.NET Framework提供的System.Diagnostics.PerformanceCounter类型可以帮助我们收集Windows操作系统下物理机或者进程的性能指标,基于PerformanceCounter类型的性能计数API在.NET Core下被彻底放弃。在.NET Core中的性能计数器具有新的玩法。 阅读全文
posted @ 2020-04-03 08:30 Artech 阅读(3509) 评论(6) 推荐(8) 编辑
摘要:《200行代码,7个对象——让你了解ASP.NET Core框架的本质》让很多读者对ASP.NET Core管道有深刻的理解,知道了ASP.NET Core框架针对每个请求的处理流程。在过去很长一段时间中,有很多人私信给我:能否按照相同的方式分析一下MVC框架。真实的MVC框架其实很复杂,所以我们依然按照类似的方式大刀阔斧地“砍掉”了很多“细枝末节”,利用一个Mini版本的模拟框架将真实ASP.NET Core MVC最核心的部分展示出来。和Mini版本的ASP.NET Core框架一样,这个Mini版的ASP.NET Core MVC框架同样采用真实框架一致的设计,并且是同样可以直接运行的。 阅读全文
posted @ 2020-04-01 08:27 Artech 阅读(5317) 评论(0) 推荐(10) 编辑
摘要:《200行代码,7个对象——让你了解ASP.NET Core框架的本质》让很多读者对ASP.NET Core管道有了真实的了解。在过去很长一段时间中,有很多人私信给我:能否按照相同的方式分析一下MVC框架的设计与实现原理,希望这篇文章能够满足你们的需求。 阅读全文
posted @ 2020-03-31 08:41 Artech 阅读(2450) 评论(2) 推荐(6) 编辑
摘要:ASP.NET Core提供了多种认证方式,它们的实现都基于相同的认证模型。本篇文章提供了一个极简的实例让读者体验如何在ASP.NET Core应用中实现认证、登录和注销 阅读全文
posted @ 2020-03-25 08:37 Artech 阅读(3746) 评论(3) 推荐(7) 编辑
摘要:ASP.NET Core框架中的很多核心对象都是通过依赖注入方式提供的,如用来对应用进行初始化的Startup对象、中间件对象,以及ASP.NET Core MVC应用中的Controller对象和View对象等,所以我们可以在定义它们的时候采用注入的形式来消费已经注册的服务。下面简单介绍几种服务注入的应用场景。 阅读全文
posted @ 2020-03-24 08:24 Artech 阅读(9242) 评论(6) 推荐(13) 编辑
摘要:《200行代码,7个对象——让你了解ASP.NET Core框架的本质》让很多读者对ASP.NET Core管道有了真实的了解。在过去很长一段时间中,有很多人私信给我:能否按照相同的方式分析一下MVC框架的设计与实现原理,希望这篇文章能够满足你们的需求。在对本章内容展开介绍之前,顺便作一下广告:《ASP.NET Core 3框架揭秘》已经开始销售,限时5折优惠还有最后3天,有兴趣的从这里入群购买。 阅读全文
posted @ 2020-03-23 08:27 Artech 阅读(2031) 评论(0) 推荐(3) 编辑