借助 .NET提供的服务承载(Hosting)系统,我们可以将一个或者多个长时间运行的后台服务寄宿或者承载我们创建的应用中.任何需要在后台长时间运行的操作都可以定义成标准化的服务并利用该系统来承载,ASP.NET Core应用最终也体现为这样一个承载服务.(本篇提供的实例已经汇总到<ASP.NET Core 6框架揭秘-实例演示版>) [S1401]利用承载服务收集性能指标(源代码) [S1402]依赖注入的应用(源代码) [S1403]配置选项的应用(源代码)[S1404]提供针对环境的配置…
借助 .NET提供的服务承载(Hosting)系统,我们可以将一个或者多个长时间运行的后台服务寄宿或者承载我们创建的应用中.任何需要在后台长时间运行的操作都可以定义成标准化的服务并利用该系统来承载,ASP.NET Core应用最终也体现为这样一个承载服务.(本篇提供的实例已经汇总到<ASP.NET Core 6框架揭秘-实例演示版>) [S1407]利用IHostApplicationLifetime对象关闭应用(源代码) [S1408]与第三方依赖注入框架的整合(源代码) [S1409]利用…
借助.NET Core提供的承载(Hosting)系统,我们可以将任意一个或者多个长时间运行(Long-Running)的服务寄宿或者承载于托管进程中.ASP.NET Core应用仅仅是该承载系统的一种典型的服务类型而已,任何需要在后台长时间运行的操作都可以定义成标准化的服务并利用该系统来承载. 一.承载长时间运行服务 一个ASP.NET Core应用本质上是一个需要长时间运行的服务,开启这个服务是为了启动一个网络监听器.当监听到抵达的HTTP请求之后,该监听器会将请求传递给应用提供的管道进行处…
ASP.NET Core应用本质上就是一个由中间件构成的管道,承载系统将应用承载于一个托管进程中运行起来,其核心任务就是将这个管道构建起来.从设计模式的角度来讲,"管道"是构建者(Builder)模式最典型的应用场景,所以ASP.NET Core先后采用的三种承载方式都是采用这种模式.(本篇提供的实例已经汇总到<ASP.NET Core 6框架揭秘-实例演示版>) [S1501]基于IWebHost/IWebHostBuilder的应用承载方式(源代码) [S1502]将初…
与服务注册一样,针对配置的设置同样可以采用三种不同的编程模式.第一种是利用WebApplicationBuilder的Host属性返回的IHostBuilder对象,它可以帮助我们设置面向宿主和应用的配置.IWebHostBuilder接口上面同样提供了一系列用来对配置进行设置的方法,我们可以将这些方法应用到WebApplicationBuilder的WebHost属性返回的IWebHostBuilder对象上.不过还是那句话,既然推荐使用Mininal API,最好还是采用最新的编程方式.(本…
生命周期决定了IServiceProvider对象采用怎样的方式提供和释放服务实例.虽然不同版本的依赖注入框架针对服务实例的生命周期管理采用了不同的实现,但总的来说原理还是类似的.在我们提供的依赖注入框架Cat中,我们已经模拟了三种生命周期模式的实现原理,接下来我们结合“服务范围”的概念来对这个话题做进一步讲述. 一.服务范围(Service Scope) 对于依赖注入框架采用的三种生命周期模式(Singleton.Scoped和Transient)来说,Singleton和Transient都…
包含服务注册信息的IServiceCollection集合最终被用来创建作为依赖注入容器的IServiceProvider对象.当需要消费某个服务实例的时候,我们只需要指定服务类型调用IServiceProvider的GetService方法即可,IServiceProvider对象就会根据对应的服务注册提供所需的服务实例. 一.IServiceProvider 如下面的代码片段所示,IServiceProvider接口定义了唯一的GetService方法根据指定的类型来提供对应的服务实例.当利…
通过<利用容器提供服务>我们知道作为依赖注入容器的IServiceProvider对象是通过调用IServiceCollection接口的扩展方法BuildServiceProvider创建的,IServiceCollection对象是一个存放服务注册信息的集合.在<一个迷你版DI框架>中创建的Cat框架中的服务注册是通过类型ServiceRegistry表示的,在.NET Core依赖注入框架中,与之对应的类型是ServiceDescriptor. 一.IServiceColle…
毫不夸张地说,整个ASP.NET Core框架是建立在依赖注入框架之上的.ASP.NET Core应用在启动时构建管道以及利用该管道处理每个请求过程中使用到的服务对象均来源于依赖注入容器.该依赖注入容器不仅为ASP.NET Core框架自身提供必要的服务,同时也是应用程序的服务提供者,依赖注入已经成为了ASP.NET Core应用的基本编程模式. 一.服务的注册与消费 为了让读者朋友们能够更加容易地认识.NET Core提供的依赖注入框架,我在“<一个迷你版DI框架>”中特意创建了一个名为Ca…
ASP.NET Core应用 具有很多读取文件的场景,比如配置文件.静态Web资源文件(比如CSS.JavaScript和图片文件等)以及MVC应用的View文件,甚至是直接编译到程序集中的内嵌资源文件.这些文件的读取都需要使用到一个IFileProvider对象.IFileProvider对象构建了一个抽象的文件系统,我们不仅可以利用它提供的统一API来读取各种类型的文件,还能及时监控目标文件的变化. 一.树形层次结构 IFileProvider对象为我们构建了一个具有层次化目录结构的文件系统…
.NET Core具有一个承载(Hosting)系统,承载需要在后台长时间运行的服务,一个ASP.NET Core应用仅仅是该系统承载的一种服务而已.承载系统总是采用依赖注入的方式来消费它在服务承载过程所需的服务.对于承载系统来说,原始的服务注册总是体现为一个IServiceCollection集合,最终的依赖注入容器则体现为一个IServiceProvider对象,如果要将第三方依赖注入框架整合进来,就需要利用它们解决从IServiceCollection集合到IServiceProvider…
我们在<上篇>利用dotnet new命令创建了一个简单的控制台程序,接下来我们将它改造成一个ASP.NET Core应用.一个ASP.NET Core应用构建在ASP.NET Core框架之上,ASP.NET Core框架利用一个消息处理管道完成对HTTP请求的监听.接收.处理和最终的响应.ASP.NET Core管道由一个服务器(Server)和若干中间件(Middleware)构成,当宿主(Host)程序启动之后,管道被构建出来,作为管道"龙头"的服务器开始监听来自客…
我们在<上篇>利用dotnet new命令创建了一个简单的控制台程序,接下来我们将它改造成一个ASP.NET Core应用.一个ASP.NET Core应用构建在ASP.NET Core框架之上,ASP.NET Core框架利用一个消息处理管道完成对HTTP请求的监听.接收.处理和最终的响应.ASP.NET Core管道由一个服务器(Server)和若干中间件(Middleware)构成,当宿主(Host)程序启动之后,管道被构建出来,作为管道“龙头”的服务器开始监听来自客户端的HTTP请求.…
依赖注入不仅是支撑整个ASP.NET Core框架的基石,也是开发ASP.NET Core应用采用的基本编程模式,所以依赖注入十分重要.依赖注入使我们可以将依赖的功能定义成服务,最终以一种松耦合的形式注入消费该功能的组件或者服务中.除了采用依赖注入的形式消费承载某种功能的服务,还可以采用相同的方式消费承载配置数据的Options对象. 一.将配置绑定为Options对象 Options模式是一种采用依赖注入的方式来提供Options对象的编程方式,但这并不意味着我们会直接利用依赖注入框架来提供O…
四.直接初始化Options对象 前面演示的几个实例具有一个共同的特征,即都采用配置系统来提供绑定Options对象的原始数据,实际上,Options框架具有一个完全独立的模型,可以称为Options模型.这个独立的Options模型本身并不依赖于配置系统,让配置系统来提供配置数据仅仅是通过Options模型的一个扩展点实现的.在很多情况下,可能并不需要将应用的配置选项定义在配置文件中,在应用启动时直接初始化可能是一种更方便快捷的方式. class Program { static void M…
作为一个17年的.NET开发者,我对一件事特别不能理解:我们的计算机图书市场充斥着一系列介绍ASP.NET Web Forms.ASP.NET MVC.ASP.NET Web API的书籍,但是却找不到一本专门介绍ASP.NET自身框架的著作.我们知道上述这些Web开发框架都是建立在ASP.NET这个底层框架之上,底层的ASP.NET框架才是根基所在.在过去的这些年里,我接触过很多资深的ASP.NET开发人员,发现他们对ASP.NET框架大都没有深入的了解. 2014年,在向出版社提交了<ASP…
在过去一段时间内,写了一系列关于ASP.NET Core 3相关的文章,其中绝大部分来源于即将出版的<ASP.NET Core 3框架揭秘>(博文只能算是"初稿",与书中相应章节具有一定差异),先将它们汇总在这里.如果对<ASP.NET Core 3框架揭秘>感兴趣,可以通过这里加入读者群以及时获取本书动态. 跨平台开发体验 跨平台开发体验: Windows [上篇]跨平台开发体验: Windows [中篇]跨平台开发体验: Windows [下篇]跨平台开发体…
作为<ASP.NET Core 3框架揭秘>的升级版,<ASP.NET Core 6框架揭秘>提供了很多新的章节,同时对现有的内容进行大量的修改.虽然本书旨在对ASP.NET Core框架的架构设计和实现原理进行剖析,但是其中提供的258个实例演示却可以作为入门材料,这个系列会将这些演示实例单独提取出来并进行汇总.对于想学习ASP.NET Core的同学,如果你觉得没有必要"砖的这么深",倒是可以看看.本片提供的20个简单的演示实例基本涵盖了ASP.NET Co…
依赖注入使我们可以将依赖的功能定义成服务,最终以一种松耦合的形式注入消费该功能的组件或者服务中.除了可以采用依赖注入的形式消费承载某种功能的服务,还可以采用相同的方式消费承载配置数据的Options对象,这篇文章演示几种典型的编程模式.(本篇提供的实例已经汇总到<ASP.NET Core 6框架揭秘-实例演示版>) [601]将配置绑定为Options对象(源代码) [602]具名Options的注册和提取(源代码) [603]Options与配置源的实时同步(匿名Options)(源代码)…
.NET提供了两个独立的缓存框架,一个是针对本地内存的缓存,另一个是针对分布式存储的缓存.前者可以在不经过序列化的情况下直接将对象存储在应用程序进程的内存中,后者则需要将对象序列化成字节数组并存储到一个独立的"中心数据库".对于分布式缓存,.NET提供了针对Redis和SQL Server的原生支持.(本篇提供的实例已经汇总到<ASP.NET Core 6框架揭秘-实例演示版>) [S1101]基于内存的本地缓存(源代码) [S1102]基于Redis的分布式缓存(源代码)…
在一个采用依赖注入框架的应用中,我们一般不太推荐利用手工创建的HttpClient对象来进行HTTP调用,使用的HttpClient对象最好利用注入的IHttpClientFactory工厂来创建.前者引起的问题,以及后者带来的好处,将通过如下这几个演示程序展现出来.IHttpClientFactory类型由"Microsoft.Extensions.Http"这个NuGet包提供,"Microsoft.NET.Sdk.Web"SDK具有该包的默认引用.如果采用&q…
数据保护(Data Protection)框架旨在解决数据在传输与持久化存储过程中的一致性(Integrity)和机密性(confidentiality)问题,前者用于检验接收到的数据是否经过篡改,后者通过对原始的数据进行加密以避免真实的内容被人窥视.数据保护是支撑ASP.NET身份认证的一个重要的基础框架,同时也可以作为独立的框架供我们使用.(本篇提供的实例已经汇总到<ASP.NET Core 6框架揭秘-实例演示版>) [S1301]数据的加解密(源代码) [S1302]Purpose字符…
ASP.NET Core的请求处理管道由一个服务器和一组中间件组成,位于 "龙头" 的服务器负责请求的监听.接收.分发和最终的响应,针对请求的处理由后续的中间件来完成.中间件最终体现为一个Func<RequestDelegate, RequestDelegate>委托,但是我们具有不同的定义和注册方式.(本篇提供的实例已经汇总到<ASP.NET Core 6框架揭秘-实例演示版>) [S1505]以Func<RequestDelegate, Request…
很多人可能对ASP.NET Core框架自身记录的诊断日志并不关心,其实这些日志对纠错排错和性能监控提供了很有用的信息.如果需要创建一个APM(Application Performance Management)系统来监控ASP.NET Core应用处理请求的性能及出现的异常,我们完全可以将HostingApplication对象记录的日志作为收集的原始数据.实际上,目前很多APM(如OpenTelemetry.NET .Elastic APM和SkyWalking APM等)针对都是利用这种…
作为ASP.NET Core请求处理管道的"龙头"的服务器负责监听和接收请求并最终完成对请求的响应.它将原始的请求上下文描述为相应的特性(Feature),并以此将HttpContext上下文创建出来,中间件针对HttpContext上下文的所有操作将借助于这些特性转移到原始的请求上下文上.学习ASP.NET Core框架最有效的方式就是按照它的原理"再造"一个框架,了解服务器的本质最好的手段就是试着自定义一个服务器.现在我们自定义一个真正的服务器.在此之前,我们再…
作为<ASP.NET Core 3 框架揭秘>的升级版,<ASP.NET Core 6框架揭秘>不仅针对ASP.NET Core 6的新特性进行了修订,并添加了若干原来没有的内容.对于ASP.NET Core 框架来说,最为核心的莫过于中间件管道的构建,这也是<ASP.NET Core 6 框架揭秘>最为核心的内容,现将这部分近200页的内容作为样章发布出来,希望能够帮助大家更好地理解ASP.NET Core框架的本质.扫描下面二维码通过百度网盘下载或者阅读,其他下载或…
作为<ASP.NET Core 3 框架揭秘>的升级版,<ASP.NET Core 6框架揭秘>不仅针对ASP.NET Core 6的新特性进行了修订,并添加了若干原来没有的内容.对于ASP.NET Core 框架来说,最为核心的莫过于中间件管道的构建,这也是<ASP.NET Core 6 框架揭秘>最为核心的内容,现将这部分近200页的内容作为样章发布出来,希望能够帮助大家更好地理解ASP.NET Core框架的本质.扫描下面二维码通过百度网盘下载或者阅读,其他下载或…
由于ASP.NET是一个同时处理多个请求的Web应用框架,所以在处理某个请求过程中出现异常并不会导致整个应用的中止.出于安全方面的考量,为了避免敏感信息外泄,客户端在默认情况下并不会得到详细的出错信息,这无疑会在开发过程中增加查错和纠错的难度.对于生产环境来说,我们也希望最终用户能够根据具体的错误类型得到具有针对性并且友好的错误消息.ASP.NET提供的相应的中间件可以帮助我们将定制化的错误信息呈现出来.本文提供的示例演示已经同步到<ASP.NET Core 6框架揭秘-实例演示版>) 目录[…
NuGet包"Microsoft.AspNetCore.Diagnostics"中提供了几个与异常处理相关的中间件,我们可以利用它们将原生的或者定制的错误信息作为响应内容发送给客户端.<错误页面的N种呈现方式>演示了几个简单的实例使读者大致了解这些中间件的作用,现在我们来演示几个高阶用法.本文提供的示例演示已经同步到<ASP.NET Core 6框架揭秘-实例演示版>) [S2108]利用IDeveloperPageExceptionFilter定制开发者异常页…
对于一个 .NET Core开发人员,你可能没有使用过Docker,但是你不可能没有听说过Docker.Docker是Github上最受欢迎的开源项目之一,它号称要成为所有云应用的基石,并把互联网升级到下一代.Docker是dotCloud公司开源的一款产品,从其诞生那一刻算起,在短短两三年时间里就成为了开源社区最火爆的项目.对于完全拥抱开源的.NET Core来说,它自然应该对Docker提供完美的支持.对于接下来的内容,我们假设你已经对Docker有了基本的了解,并且在你的机器上(Windo…