摘要: ASP.NET Core 6框架揭秘(上下册)》主要介绍 ASP.NET Core 框架的核心技术部分,即由一个服务器和若干中间件构建的管道。本书共分为 5 篇:“第 1 篇 初识编程(第 1 章)”列举一系列极简的实例为读者提供基本的编程体验,“第 2 篇 基础框架(第 2~13 章)”主要介绍了一系列支撑 ASP.NET Core 的基础框架,“第 3 篇 承载系统(第 14~17章)”主要介绍了 ASP.NET Core 应用的承载流程,“第 4 篇 服务器概述(第 18 章)”列举一系列常见的服务器类型并对它们进行了比较,“第 5 篇 中间件(第 19~30 章)”系统地介绍了一系列预定义的中间件。 阅读全文
posted @ 2022-06-26 22:08 Artech 阅读(3166) 评论(8) 推荐(1) 编辑
摘要: 作为《ASP.NET Core 3框架揭秘》的升级版,《ASP.NET Core 6框架揭秘》(6折优惠,首印送签名专属书签)提供了很多新的章节,同时对现有的内容进行大量的修改。虽然本书旨在对ASP.NET Core框架的架构设计和实现原理进行剖析,但是其中提供的258个实例演示却可以作为入门材料, 阅读全文
posted @ 2022-02-22 08:23 Artech 阅读(13029) 评论(7) 推荐(43) 编辑
摘要: 我们知道,建立在HTTP2/3之上的gRPC具有四种基本的通信模式或者消息交换模式(MEP: Message Exchange Pattern),即Unary、Server Stream、Client Stream和Bidirectional Stream。本篇文章通过4个简单的实例演示它们在.NET平台上的实现原理,源代码从这里查看。 阅读全文
posted @ 2022-11-21 08:55 Artech 阅读(2798) 评论(3) 推荐(8) 编辑
摘要: System.Runtime.CompilerServices命名空间下有4个以“Caller”为前缀命名的Attribute,我们可以将它标注到方法参数上自动获取当前调用上下文的信息,比如当前的方法名、某个参数的表达式、当前源文件的路径,以及当前代码在源文件中的行号。 阅读全文
posted @ 2022-10-09 09:30 Artech 阅读(1628) 评论(0) 推荐(10) 编辑
摘要: 客户端和服务器基于HTTP的消息交换就好比两个完全没有记忆能力的人在交流,每次单一的HTTP事务体现为一次“一问一答”的对话。单一的对话毫无意义,在在同一语境下针对某个主题进行的多次对话才会有结果。会话的目的就是在同一个客户端和服务器之间建立两者交谈的语境或者上下文,ASP.NET Core利用一个名为SessionMiddleware的中间件实现了会话。本篇提供了几个简单的实例来演示如何在一个ASP.NET Core应用中利用会话来存储用户的状态。 阅读全文
posted @ 2022-09-06 08:11 Artech 阅读(1104) 评论(0) 推荐(7) 编辑
摘要: 我们利用ASP.NET开发的大部分API都是为了对外提供资源,对于不易变化的资源内容,针对某个维度对其实施缓存可以很好地提供应用的性能。《内存缓存与分布式缓存的使用》介绍的两种缓存框架(本地内存缓存和分布式缓存)为我们提供了简单易用的缓存读写编程模式,本篇介绍的则是针对针对HTTP响应内容实施缓存,ResponseCachingMiddleware中间件赋予我们的能力。 阅读全文
posted @ 2022-08-29 08:18 Artech 阅读(1086) 评论(0) 推荐(4) 编辑
摘要: NuGet包“Microsoft.AspNetCore.Diagnostics”中提供了几个与异常处理相关的中间件,我们可以利用它们将原生的或者定制的错误信息作为响应内容发送给客户端。《错误页面的N种呈现方式》演示了几个简单的实例使读者大致了解这些中间件的作用,现在我们来演示几个高阶用法。 阅读全文
posted @ 2022-08-22 08:07 Artech 阅读(3221) 评论(4) 推荐(8) 编辑
摘要: 由于ASP.NET是一个同时处理多个请求的Web应用框架,所以在处理某个请求过程中出现异常并不会导致整个应用的中止。出于安全方面的考量,为了避免敏感信息外泄,客户端在默认情况下并不会得到详细的出错信息,这无疑会在开发过程中增加查错和纠错的难度。对于生产环境来说,我们也希望最终用户能够根据具体的错误类型得到具有针对性并且友好的错误消息。ASP.NET提供的相应的中间件可以帮助我们将定制化的错误信息呈现出来。 阅读全文
posted @ 2022-08-11 08:06 Artech 阅读(2937) 评论(1) 推荐(11) 编辑
摘要: ASP.NET的路由是通过EndpointRoutingMiddleware和EndpointMiddleware这两个中间件协作完成的,它们在ASP.NET平台上具有举足轻重的地位,MVC和gRPC框架,Dapr的Actor和发布订阅编程模式都建立在路由系统之上。Minimal API更是将提升到了前所未有的高度,上一篇通过9个实例演示了基于路由的REST API开发,本篇演示一些“高阶”的用法。 阅读全文
posted @ 2022-08-02 10:13 Artech 阅读(3305) 评论(1) 推荐(12) 编辑
摘要: ASP.NET的路由是通过EndpointRoutingMiddleware和EndpointMiddleware这两个中间件协作完成的,它们在ASP.NET平台上具有举足轻重的地位,MVC和gRPC框架,Dapr的Actor和发布订阅编程模式都建立在路由系统之上。Minimal API更是将提升到了前所未有的高度,是我们直接在路由系统基础上定义REST API 阅读全文
posted @ 2022-08-01 08:30 Artech 阅读(1332) 评论(0) 推荐(7) 编辑
摘要: ASP.NET Core 6框架揭秘实例演示[29]:搭建文件服务器 通过HTTP请求获取的Web资源很多都来源于存储在服务器磁盘上的静态文件。对于ASP.NET应用来说,如果将静态文件存储到约定的目录下,绝大部分文件类型都是可以通过Web的形式对外发布的。“Microsoft.AspNetCore.StaticFiles” 这个NuGet包中提供了三个用来处理静态文 阅读全文
posted @ 2022-07-28 08:22 Artech 阅读(1453) 评论(2) 推荐(5) 编辑
摘要: P5第2段 原文:由于创建的是一个针对 ASP.NET Core 的可执行控制台应用,所以将 OutputType 和 TargetFramework 的属性分别设置为“Exe”和“net6.0”。 改为:由于创建的是一个针对 .NET 6的可执行控制台应用,所以将 OutputType 和 Tar 阅读全文
posted @ 2022-07-17 14:22 Artech 阅读(1246) 评论(23) 推荐(3) 编辑
摘要: 天下大势,分久必合,合久必分”,ASP.NET应用通过GenericWebHostService这个承载服务被整合到基于IHostBuilder/IHost的服务承载系统中之后,也许微软还是意识到Web应用和后台服务的承载方式还是应该加以区分,于是推出了基于WebApplicationBuilder/WebApplication的承载方式。我们可以将其称为第三代承载模式,它有一个官方的名称叫做“Minimal API”。Minimal API同样面临向后兼容的问题,而且这次需要同时兼容前面两代承载模式,所以我们会发现“上篇”中提到的一系列初始化操作有了更多实现方式。 阅读全文
posted @ 2022-07-11 08:04 Artech 阅读(1829) 评论(4) 推荐(12) 编辑
摘要: 《ASP.NET Core 6框架揭秘》样章[200页/5章] 作为《ASP.NET Core 3 框架揭秘》的升级版,《ASP.NET Core 6框架揭秘》不仅针对ASP.NET Core 6的新特性进行了修订,并添加了若干原来没有的内容。对于ASP.NET Core 框架来说,最为核心的莫过于中间件管道的构建,这也是《ASP.NET Core 6 框架揭秘 阅读全文
posted @ 2022-07-07 08:59 Artech 阅读(1530) 评论(0) 推荐(5) 编辑
摘要: 在ASP.NET Core的发展历史上先后出现了三种应用承载的编程方式,而且后一种编程模式都提供了针对之前编程模式的全部或者部分兼容,这就导致了一种现象:相同的更能具有N种实现方式。对这个发展历程不是特别了解的读者会有很多疑问?为什么这么多不同的编程模式都在作同一件事?它们之间的有什么差别之处?为什么有的API在最新的Minimal API又不能用了呢? 阅读全文
posted @ 2022-07-05 08:25 Artech 阅读(4622) 评论(12) 推荐(27) 编辑
摘要: Dapr 被设计成一个面向开发者的企业级微服务编程平台,它独立于具体的技术平台,可以运行在“任何地方”。Dapr本身并不提供“基础设施(infrastructure)”,而是利用自身的扩展来适配具体的部署环境。就目前的状态来说,如果希望真正将原生的Dapr应用与生产,只能部署在K8S环境下。虽然Dapr也提供针对Hashicorp Consul的支持,但是目前貌似没有稳定的版本支持。Kubernetes对于很多公司并非“标配”,由于某些原因,它们可以具有一套自研的微服务平台或者弹性云平台,让Dapr与之适配可能更有价值。 阅读全文
posted @ 2022-07-04 07:48 Artech 阅读(2827) 评论(4) 推荐(18) 编辑
摘要: 多年之前利用IL Emit写了一个名为Dora.Interception的AOP框架。前几天利用Roslyn的Source Generator对自己为公司写的一个GraphQL框架进行改造,性能得到显著的提高,觉得类似的机制同样可以用在AOP框架上,实验证明这样的实现方式不仅仅极大地改善性能(包括执行耗时和GC内存分配),而且让很多的功能特性变得简单了很多。 阅读全文
posted @ 2022-06-30 08:38 Artech 阅读(1260) 评论(3) 推荐(6) 编辑
摘要: 本系列前面的五篇文章主要介绍Dora.Interception(github地址,觉得不错不妨给一颗星)的编程模式以及对它的扩展定制,现在我们来聊聊它的设计和实现原理。(拙著《ASP.NET Core 6框架揭秘》6折优惠,首印送签名专属书签)。 阅读全文
posted @ 2022-06-29 08:34 Artech 阅读(1510) 评论(5) 推荐(16) 编辑
摘要: Dora.Interception提供了两种拦截器注册方式,一种是利用标注在目标类型、属性和方法上的InterceptorAttribute特性,另一种采用基于目标方法或者属性的调用表达式。通过提供的扩展点,我们可以任何我们希望的拦截器注册方式。(拙著《ASP.NET Core 6框架揭秘》6折优惠,首印送签名专属书签) 阅读全文
posted @ 2022-06-27 09:05 Artech 阅读(1224) 评论(0) 推荐(6) 编辑
摘要: ASP.NET Core 6框架揭秘(上下册)》主要介绍 ASP.NET Core 框架的核心技术部分,即由一个服务器和若干中间件构建的管道。本书共分为 5 篇:“第 1 篇 初识编程(第 1 章)”列举一系列极简的实例为读者提供基本的编程体验,“第 2 篇 基础框架(第 2~13 章)”主要介绍了一系列支撑 ASP.NET Core 的基础框架,“第 3 篇 承载系统(第 14~17章)”主要介绍了 ASP.NET Core 应用的承载流程,“第 4 篇 服务器概述(第 18 章)”列举一系列常见的服务器类型并对它们进行了比较,“第 5 篇 中间件(第 19~30 章)”系统地介绍了一系列预定义的中间件。 阅读全文
posted @ 2022-06-26 22:08 Artech 阅读(3166) 评论(8) 推荐(1) 编辑
摘要: 基于特性标注的拦截器注册方式仅限于将拦截器应用到自己定义的类型上,对于第三方提供的类型就无能为力了。拦截器注册本质上建立拦截器与一个或者多个目标方法之间的映射,所以最笨的方式就是利用反射的方式得到表示目标方法的MethodInfo对象,并将它与对应的拦截器关联在一起。这种方式虽然能够解决问题,但是编程体验很差。本篇介绍的基于表达式的拦截器注册方式利用针对目标方法或者属性的调用表达式,以一种强类型的方式获取到目标方法,极大地改善了编程体验。 阅读全文
posted @ 2022-06-24 10:24 Artech 阅读(1051) 评论(3) 推荐(5) 编辑
摘要: 在Dora.Interception(github地址,觉得不错不妨给一颗星)中按照约定方式定义的拦截器可以采用多种方式注册到目标方法上。本篇文章介绍最常用的基于“特性标注”的拦截器注册方式,下一篇会介绍另一种基于(Lambda)表达式的注册方式。如果原生定义的这两种注册方式不能满足要求,利用框架提供的扩展,我们可以完成任何你想要的拦截器注册手段。( 阅读全文
posted @ 2022-06-22 09:04 Artech 阅读(1435) 评论(1) 推荐(13) 编辑
摘要: Dora.Interception有别于其他AOP框架的最大的一个特点就是采用针对“约定”的拦截器定义方式(拙著《ASP.NET Core 6框架揭秘》于日前上市,加入读者群享6折优惠) 阅读全文
posted @ 2022-06-21 08:44 Artech 阅读(883) 评论(3) 推荐(8) 编辑
摘要: 多年之前利用IL Emit写了一个名为Dora.Interception(github地址,觉得不错不妨给一颗星)的AOP框架。前几天利用Roslyn的Source Generator对自己为公司写的一个GraphQL框架进行改造,性能得到显著的提高,觉得类似的机制同样可以用在AOP框架上,实验证明这样的实现方式不仅仅极大地改善性能(包括执行耗时和GC内存分配),而且让很多的功能特性变得简单了很多 阅读全文
posted @ 2022-06-20 08:26 Artech 阅读(2849) 评论(17) 推荐(18) 编辑
摘要: 作为ASP.NET CORE请求处理管道的“龙头”的服务器负责监听和接收请求并最终完成对请求的响应。它将原始的请求上下文描述为相应的特性(Feature),并以此将HttpContext上下文创建出来,中间件针对HttpContext上下文的所有操作将借助于这些特性转移到原始的请求上下文上。除了我们最常用的Kestrel服务器,ASP.NET CORE还提供了其他类型的服务器。 阅读全文
posted @ 2022-04-11 09:41 Artech 阅读(1603) 评论(0) 推荐(3) 编辑
摘要: 如果我们只需要将ASP.NET CORE应用部署到Windows环境下,并且希望获得更好的性能,那么我们选择的服务器类型应该是HTTP.SYS。Windows环境下任何针对HTTP的网络监听器/服务器在性能上都无法与HTTP.SYS比肩。 阅读全文
posted @ 2022-04-06 10:13 Artech 阅读(4081) 评论(4) 推荐(33) 编辑
摘要: KestrelServer最大的优势体现在它的跨平台的能力,如果ASP.NET CORE应用只需要部署在Windows环境下,IIS也是不错的选择。ASP.NET CORE应用针对IIS具有两种部署模式,它们都依赖于一个IIS针对ASP.NET CORE Core的扩展模块。 阅读全文
posted @ 2022-03-31 08:28 Artech 阅读(7412) 评论(13) 推荐(40) 编辑
摘要: 和所有的服务器一样,KestrelServer最终需要解决的是网络传输的问题。在《网络连接的创建》,我们介绍了KestrelServer如何利用连接接听器的建立网络连接,并再次基础上演示了如何直接利用建立的连接接收请求和回复响应。本篇更进一步,我们根据其总体设计,定义了迷你版的KestrelServer让读者看看这个重要的服务器大体是如何实现的。 阅读全文
posted @ 2022-03-30 08:47 Artech 阅读(1840) 评论(3) 推荐(17) 编辑
摘要: 《注册监听终结点(Endpoint)》已经详细讲述了如何使用KestrelServer,现在我们来简单聊聊这种处理器的总体设计和实现原理。当KestrelServer启动的时候,注册的每个终结点将转换成对应的“连接监听器”,后者在监听到初始请求时会创建“连接”,请求的接收和响应的回复都在这个连接中完成。 阅读全文
posted @ 2022-03-29 08:33 Artech 阅读(892) 评论(1) 推荐(9) 编辑
摘要: 具有跨平台能力的KestrelServer是最重要的服务器类型。针对KestrelServer的设置均体现在KestrelServerOptions配置选项上,注册的终结点是它承载的最重要的配置选项。这里所谓的终结点(Endpoint)与“路由”介绍的终结点不是一回事,这里表示的就是服务器在监听请求时绑定的网络地址,对应着一个System.Net.Endpoint对象。 阅读全文
posted @ 2022-03-28 09:46 Artech 阅读(1598) 评论(0) 推荐(7) 编辑
摘要: Task对于.NET的重要性毋庸置疑。通过最近的一些面试经历,发现很多人对与Task及其调度机制,以及线程和线程池之间的关系并没有清晰的认识。本文采用最简单的方式模拟了Task的实现,旨在说明Task是什么?它是如何被调度执行的? 阅读全文
posted @ 2022-03-25 08:28 Artech 阅读(5548) 评论(30) 推荐(80) 编辑
摘要: 学习ASP.NET Core框架最有效的方式就是按照它的原理“再造”一个框架,了解服务器的本质最好的手段就是试着自定义一个服务器。现在我们自定义一个真正的服务器 阅读全文
posted @ 2022-03-24 09:41 Artech 阅读(1348) 评论(0) 推荐(5) 编辑
摘要: Minimal API仅仅是在基于IHost/IHostBuilder的服务承载系统上作了小小的封装而已,它利用WebApplication和WebApplicationBuilder这两个类型提供了更加简洁的API,同时提供了与现有API的兼容。要成分理解Minimal API的实现原理 阅读全文
posted @ 2022-03-23 09:45 Artech 阅读(1008) 评论(1) 推荐(4) 编辑
摘要: 很多人可能对ASP.NET Core框架自身记录的诊断日志并不关心,其实这些日志对纠错排错和性能监控提供了很有用的信息。如果需要创建一个APM(Application Performance Management)系统来监控ASP.NET Core应用处理请求的性能及出现的异常,我们完全可以将HostingApplication对象记录的日志作为收集的原始数据。实际上,目前很多APM(如OpenTelemetry.NET 、Elastic APM和SkyWalking APM等)针对都是利用这种方式收集分布式跟踪日志的。 阅读全文
posted @ 2022-03-22 09:46 Artech 阅读(1198) 评论(1) 推荐(7) 编辑
摘要: 与服务注册一样,针对配置的设置同样可以采用三种不同的编程模式。第一种是利用WebApplicationBuilder的Host属性返回的IHostBuilder对象,它可以帮助我们设置面向宿主和应用的配置。IWebHostBuilder接口上面同样提供了一系列用来对配置进行设置的方法,我们可以将这些方法应用到WebApplicationBuilder的WebHost属性返回的IWebHostBuilder对象上。不过还是那句话,既然推荐使用Mininal API,最好还是采用最新的编程方式。 阅读全文
posted @ 2022-03-21 09:43 Artech 阅读(792) 评论(2) 推荐(1) 编辑
摘要: ASP.NET Core的请求处理管道由一个服务器和一组中间件组成,位于 “龙头” 的服务器负责请求的监听、接收、分发和最终的响应,针对请求的处理由后续的中间件来完成。中间件最终体现为一个Func委托,但是我们具有不同的定义和注册方式。 阅读全文
posted @ 2022-03-18 09:29 Artech 阅读(1016) 评论(0) 推荐(4) 编辑
摘要: ASP.NET Core应用本质上就是一个由中间件构成的管道,承载系统将应用承载于一个托管进程中运行起来,其核心任务就是将这个管道构建起来。从设计模式的角度来讲,“管道”是构建者(Builder)模式最典型的应用场景,所以ASP.NET Core先后采用的三种承载方式都是采用这种模式。 阅读全文
posted @ 2022-03-17 08:23 Artech 阅读(1314) 评论(2) 推荐(4) 编辑
摘要: 借助 .NET提供的服务承载(Hosting)系统,我们可以将一个或者多个长时间运行的后台服务寄宿或者承载我们创建的应用中。任何需要在后台长时间运行的操作都可以定义成标准化的服务并利用该系统来承载,ASP.NET Core应用最终也体现为这样一个承载服务。 阅读全文
posted @ 2022-03-16 09:49 Artech 阅读(1072) 评论(1) 推荐(4) 编辑
摘要: 借助 .NET提供的服务承载(Hosting)系统,我们可以将一个或者多个长时间运行的后台服务寄宿或者承载我们创建的应用中。任何需要在后台长时间运行的操作都可以定义成标准化的服务并利用该系统来承载,ASP.NET Core应用最终也体现为这样一个承载服务。 阅读全文
posted @ 2022-03-15 08:44 Artech 阅读(3378) 评论(0) 推荐(13) 编辑
摘要: 《数据加解密与哈希》演示了“数据保护”框架如何用来对数据进行加解密,而“数据保护”框架的核心是“密钥管理”。数据保护框架以XML的形式来存储密钥,默认的IKeyManager实现类型为XmlKeyManager。接下来我们通过模拟代码和实例演示的形式来介绍一下XmlKeyManager对象针对密钥的创建、撤销和回收的实现原理。( 阅读全文
posted @ 2022-03-14 09:51 Artech 阅读(914) 评论(0) 推荐(4) 编辑
摘要: 数据保护(Data Protection)框架旨在解决数据在传输与持久化存储过程中的一致性(Integrity)和机密性(confidentiality)问题,前者用于检验接收到的数据是否经过篡改,后者通过对原始的数据进行加密以避免真实的内容被人窥视。数据保护是支撑ASP.NET身份认证的一个重要的基础框架,同时也可以作为独立的框架供我们使用。( 阅读全文
posted @ 2022-03-11 08:34 Artech 阅读(1555) 评论(0) 推荐(7) 编辑
摘要: 我们知道ASP.NET的核心就是由中间件组成的请求处理管道,HttpClient也采用了类似的设计。HttpClient管道由一组HttpMessageHandler对象构成,这些HttpMessageHandler相当于ASPNET的中间件。如下这些示例演示帮助我们更清楚地认识HttpMessageHandler处理管道。 阅读全文
posted @ 2022-03-10 09:09 Artech 阅读(1730) 评论(3) 推荐(14) 编辑