上一页 1 2 3 4 5 6 7 ··· 22 下一页
摘要: Task对于.NET的重要性毋庸置疑。通过最近的一些面试经历,发现很多人对与Task及其调度机制,以及线程和线程池之间的关系并没有清晰的认识。本文采用最简单的方式模拟了Task的实现,旨在说明Task是什么?它是如何被调度执行的? 阅读全文
posted @ 2022-03-25 08:28 Artech 阅读(6583) 评论(31) 推荐(83) 编辑
摘要: 学习ASP.NET Core框架最有效的方式就是按照它的原理“再造”一个框架,了解服务器的本质最好的手段就是试着自定义一个服务器。现在我们自定义一个真正的服务器 阅读全文
posted @ 2022-03-24 09:41 Artech 阅读(1828) 评论(0) 推荐(5) 编辑
摘要: Minimal API仅仅是在基于IHost/IHostBuilder的服务承载系统上作了小小的封装而已,它利用WebApplication和WebApplicationBuilder这两个类型提供了更加简洁的API,同时提供了与现有API的兼容。要成分理解Minimal API的实现原理 阅读全文
posted @ 2022-03-23 09:45 Artech 阅读(1390) 评论(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 阅读(1590) 评论(1) 推荐(7) 编辑
摘要: 与服务注册一样,针对配置的设置同样可以采用三种不同的编程模式。第一种是利用WebApplicationBuilder的Host属性返回的IHostBuilder对象,它可以帮助我们设置面向宿主和应用的配置。IWebHostBuilder接口上面同样提供了一系列用来对配置进行设置的方法,我们可以将这些方法应用到WebApplicationBuilder的WebHost属性返回的IWebHostBuilder对象上。不过还是那句话,既然推荐使用Mininal API,最好还是采用最新的编程方式。 阅读全文
posted @ 2022-03-21 09:43 Artech 阅读(1177) 评论(2) 推荐(1) 编辑
摘要: ASP.NET Core的请求处理管道由一个服务器和一组中间件组成,位于 “龙头” 的服务器负责请求的监听、接收、分发和最终的响应,针对请求的处理由后续的中间件来完成。中间件最终体现为一个Func委托,但是我们具有不同的定义和注册方式。 阅读全文
posted @ 2022-03-18 09:29 Artech 阅读(1419) 评论(0) 推荐(5) 编辑
摘要: ASP.NET Core应用本质上就是一个由中间件构成的管道,承载系统将应用承载于一个托管进程中运行起来,其核心任务就是将这个管道构建起来。从设计模式的角度来讲,“管道”是构建者(Builder)模式最典型的应用场景,所以ASP.NET Core先后采用的三种承载方式都是采用这种模式。 阅读全文
posted @ 2022-03-17 08:23 Artech 阅读(1856) 评论(2) 推荐(4) 编辑
摘要: 借助 .NET提供的服务承载(Hosting)系统,我们可以将一个或者多个长时间运行的后台服务寄宿或者承载我们创建的应用中。任何需要在后台长时间运行的操作都可以定义成标准化的服务并利用该系统来承载,ASP.NET Core应用最终也体现为这样一个承载服务。 阅读全文
posted @ 2022-03-16 09:49 Artech 阅读(1520) 评论(1) 推荐(5) 编辑
摘要: 借助 .NET提供的服务承载(Hosting)系统,我们可以将一个或者多个长时间运行的后台服务寄宿或者承载我们创建的应用中。任何需要在后台长时间运行的操作都可以定义成标准化的服务并利用该系统来承载,ASP.NET Core应用最终也体现为这样一个承载服务。 阅读全文
posted @ 2022-03-15 08:44 Artech 阅读(4004) 评论(0) 推荐(15) 编辑
摘要: 《数据加解密与哈希》演示了“数据保护”框架如何用来对数据进行加解密,而“数据保护”框架的核心是“密钥管理”。数据保护框架以XML的形式来存储密钥,默认的IKeyManager实现类型为XmlKeyManager。接下来我们通过模拟代码和实例演示的形式来介绍一下XmlKeyManager对象针对密钥的创建、撤销和回收的实现原理。( 阅读全文
posted @ 2022-03-14 09:51 Artech 阅读(1165) 评论(0) 推荐(4) 编辑
摘要: 数据保护(Data Protection)框架旨在解决数据在传输与持久化存储过程中的一致性(Integrity)和机密性(confidentiality)问题,前者用于检验接收到的数据是否经过篡改,后者通过对原始的数据进行加密以避免真实的内容被人窥视。数据保护是支撑ASP.NET身份认证的一个重要的基础框架,同时也可以作为独立的框架供我们使用。( 阅读全文
posted @ 2022-03-11 08:34 Artech 阅读(2114) 评论(0) 推荐(9) 编辑
摘要: 我们知道ASP.NET的核心就是由中间件组成的请求处理管道,HttpClient也采用了类似的设计。HttpClient管道由一组HttpMessageHandler对象构成,这些HttpMessageHandler相当于ASPNET的中间件。如下这些示例演示帮助我们更清楚地认识HttpMessageHandler处理管道。 阅读全文
posted @ 2022-03-10 09:09 Artech 阅读(2437) 评论(3) 推荐(14) 编辑
摘要: 在一个采用依赖注入框架的应用中,我们一般不太推荐利用手工创建的HttpClient对象来进行HTTP调用,使用的HttpClient对象最好利用注入的IHttpClientFactory工厂来创建。前者引起的问题,以及后者带来的好处,将通过如下这几个演示程序展现出来。IHttpClientFactory类型由“Microsoft.Extensions.Http”这个NuGet包提供,“Microsoft.NET.Sdk.Web”SDK具有该包的默认引用。 阅读全文
posted @ 2022-03-09 08:14 Artech 阅读(2535) 评论(7) 推荐(13) 编辑
摘要: .NET提供了两个独立的缓存框架,一个是针对本地内存的缓存,另一个是针对分布式存储的缓存。前者可以在不经过序列化的情况下直接将对象存储在应用程序进程的内存中,后者则需要将对象序列化成字节数组并存储到一个独立的“中心数据库”。对于分布式缓存,.NET提供了针对Redis和SQL Server的原生支持 阅读全文
posted @ 2022-03-08 08:34 Artech 阅读(4783) 评论(8) 推荐(17) 编辑
摘要: 针对控制台的ILogger实现类型为ConsoleLogger,对应的ILoggerProvider实现类型为ConsoleLoggerProvider,这两个类型都定义在 NuGet包“Microsoft.Extensions.Logging.Console”中。ConsoleLogger要将一条日志输出到控制台上,首选要解决的是格式化的问题,具体来说是如何将日志消息的内容荷载和元数据(类别、等级和事件ID等)格式化成呈现在控制台上的文本。针对日志的格式化由ConsoleFormatter对象来完成。 阅读全文
posted @ 2022-03-07 08:45 Artech 阅读(2031) 评论(0) 推荐(3) 编辑
摘要: 为了对各种日志框架进行整合,微软创建了一个用来提供统一的日志编程模式的日志框架。《日志的基本编程模式》以实例演示的方式介绍了日志的基本编程模式,现在我们来补充几种“进阶”用法。 阅读全文
posted @ 2022-03-04 09:06 Artech 阅读(2118) 评论(0) 推荐(3) 编辑
摘要: 《诊断跟踪的几种基本编程方式》介绍了四种常用的诊断日志框架。其实除了微软提供的这些日志框架,还有很多第三方日志框架可供我们选择,比如Log4Net、NLog和Serilog 等。虽然这些框架大都采用类似的设计,但是它们采用的编程模式具有很大的差异。为了对这些日志框架进行整合,微软创建了一个用来提供统一的日志编程模式的日志框架。( 阅读全文
posted @ 2022-03-03 08:55 Artech 阅读(2143) 评论(1) 推荐(7) 编辑
摘要: 一个好的程序员能够在系统出现问题之后马上定位错误的根源并找到正确的解决方案,一个更好的程序员能够根据当前的运行状态预知未来可能发生的问题,并将问题扼杀在摇篮中。诊断跟踪能够帮助我们有效地纠错和排错《几种基本诊断跟踪编程方式》提供了7个实例演示了针对TraceSource、EventSource和DiagnosticSource的基本用法,其实它们还具有一个更“高级”的使用方式。( 阅读全文
posted @ 2022-03-02 08:31 Artech 阅读(1758) 评论(2) 推荐(7) 编辑
摘要: 在整个软件开发维护生命周期内,最难的不是如何将软件系统开发出来,而是在系统上线之后及时解决遇到的问题。一个好的程序员能够在系统出现问题之后马上定位错误的根源并找到正确的解决方案,一个更好的程序员能够根据当前的运行状态预知未来可能发生的问题,并将问题扼杀在摇篮中。合理地利用诊断手段能够帮助我们有效地纠错和排错。 阅读全文
posted @ 2022-03-01 08:38 Artech 阅读(2023) 评论(2) 推荐(7) 编辑
摘要: 依赖注入使我们可以将依赖的功能定义成服务,最终以一种松耦合的形式注入消费该功能的组件或者服务中。除了可以采用依赖注入的形式消费承载某种功能的服务,还可以采用相同的方式消费承载配置数据的Options对象,这篇文章演示几种典型的编程模式。 阅读全文
posted @ 2022-02-28 09:44 Artech 阅读(2558) 评论(1) 推荐(9) 编辑
摘要: 我们倾向于将IConfiguration对象转换成一个具体的对象,以面向对象的方式来使用配置,我们将这个转换过程称为配置绑定。除了将配置树叶子节点配置节的绑定为某种标量对象外,我们还可以直接将一个配置节绑定为一个具有对应结构的符合对象。除此之外,配置绑定还支持针对数据、集合和字典类型的绑定。 阅读全文
posted @ 2022-02-25 08:31 Artech 阅读(1282) 评论(5) 推荐(7) 编辑
摘要: .NET的配置支持多样化的数据源,我们可以采用内存的变量、环境变量、命令行参数、以及各种格式的配置文件作为配置的数据来源。在对配置系统进行系统介绍之前,我们通过几个简单的实例演示一下如何将具有不同来源的配置数据构建为一个统一的配置对象,并以相同的方式读取具体配置节的内容。 阅读全文
posted @ 2022-02-24 08:55 Artech 阅读(2246) 评论(2) 推荐(9) 编辑
摘要: ASP.NET Core应用具有很多读取文件的场景,如读取配置文件、静态Web资源文件(如CSS、JavaScript和图片文件等)、MVC应用的视图文件,以及直接编译到程序集中的内嵌资源文件。这些文件的读取都需要使用一个IFileProvider对象。IFileProvider对象构建了一个抽象的文件系统,我们不仅可以利用该系统提供的统一API来读取各种类型的文件,还能及时监控目标文件的变化。 阅读全文
posted @ 2022-02-23 08:53 Artech 阅读(2643) 评论(5) 推荐(3) 编辑
摘要: 作为《ASP.NET Core 3框架揭秘》的升级版,《ASP.NET Core 6框架揭秘》提供了很多新的章节,同时对现有的内容进行大量的修改。虽然本书旨在对ASP.NET Core框架的架构设计和实现原理进行剖析,但是其中提供的258个实例演示却可以作为入门材料,这个系列会将这些演示实例单独提取 阅读全文
posted @ 2022-02-22 08:23 Artech 阅读(23459) 评论(8) 推荐(55) 编辑
摘要: 由于依赖注入具有举足轻重的作用,所以《ASP.NET Core 6框架揭秘》的绝大部分章节都会涉及这一主题。本书第3章对.NET原生的依赖注入框架的设计和实现进行了系统的介绍,其中设计一些“鲜为人知”的细节,其中一部分就体现在本篇提供的这几个实例演示上。 阅读全文
posted @ 2022-02-21 08:50 Artech 阅读(3128) 评论(18) 推荐(11) 编辑
摘要: 毫不夸张地说,整个ASP.NET Core就是建立在依赖注入框架之上的。ASP.NET Core应用在启动时构建管道所需的服务,以及管道处理请求使用到的服务,均来源于依赖注入容器。依赖注入容器不仅为ASP.NET Core框架自身提供必要的服务,还为应用程序提供服务,依赖注入已经成为ASP.NET Core应用的基本编程模式。 阅读全文
posted @ 2022-02-18 08:57 Artech 阅读(6034) 评论(11) 推荐(16) 编辑
摘要: ASP.NET Core框架建立在一个依赖注入框架之上,已注入的方式消费服务已经成为了ASP.NET Core基本的编程模式。为了使读者能够更好地理解原生的注入框架框架,我按照类似的设计创建了一个简易版本的依赖注入框架,并它命名为“Cat”。本篇提供的四个实例主要体现了针对Cat的用法,《一个Mini版的依赖注入框架》提供了针对设计和实现原理的介绍。 阅读全文
posted @ 2022-02-17 08:39 Artech 阅读(3801) 评论(1) 推荐(11) 编辑
摘要: 也许你们可能没有接触过Dapr,但是一定对它“有所耳闻”,感觉今年它一下子就火了,一时间很多人都在谈论它。我们从其命名(Dapr的全称是“分布式应用运行时Distributed Application Runtime”)可以看出Dapr的定位,它并不是分布式应用的开发框架,它提供的是更底层的“运行时”。我们可以使用不同的编程语言,采用不同的开发框架在这个由Dapr提供的运行时上面构建分布式应用 阅读全文
posted @ 2022-02-16 08:41 Artech 阅读(5403) 评论(5) 推荐(12) 编辑
摘要: ASP.NET Core可以视为一种底层框架,它为我们构建出了基于管道的请求处理模型,这个管道由一个服务器和多个中间件构成,而与路由相关的EndpointRoutingMiddleware和EndpointMiddleware是两个最为重要的中间件。MVC和gRPC开发框架就建立在路由基础上。本篇提供了四个实例用来演示如何利用路由、MVC和gRPC来开发API/APP。 阅读全文
posted @ 2022-02-15 08:24 Artech 阅读(7331) 评论(6) 推荐(24) 编辑
摘要: 作为《ASP.NET Core 3框架揭秘》的升级版,《ASP.NET Core 6框架揭秘》提供了很多新的章节,同时对现有的内容进行大量的修改。虽然本书旨在对ASP.NET Core框架的架构设计和实现原理进行剖析,但是其中提供的258个实例演示却可以作为入门材料,这个系列会将这些演示实例单独提取出来并进行汇总。对于想学习ASP.NET Core的同学,如果你觉得没有必要“砖的这么深”,倒是可以看看。 阅读全文
posted @ 2022-02-14 09:01 Artech 阅读(15443) 评论(26) 推荐(71) 编辑
摘要: 原则上所有的引用类型对象都可以通过对象池来提供,但是在具体的应用中需要权衡是否值得用。我们在使用之前得考虑当前场景是否适用对象池,在使用的时候严格按照“有借有还”、“不用才还”的原则。 阅读全文
posted @ 2021-08-26 08:30 Artech 阅读(4166) 评论(9) 推荐(22) 编辑
摘要: 《编程篇》已经涉及到了对象池模型的大部分核心接口和类型。对象池模型其实是很简单的,不过其中有一些为了提升性能而刻意为之的实现细节倒是值得我们关注。总的来说,对象池模型由三个核心对象构成,它们分别是表示对象池的ObjectPool对象、对象值提供者的ObjectPoolProvider对象,已及控制池化对象创建与释放行为的IPooledObjectPolicy对象 阅读全文
posted @ 2021-08-25 08:31 Artech 阅读(2394) 评论(9) 推荐(14) 编辑
摘要: 借助于有效的自动化垃圾回收机制,.NET让开发人员不在关心对象的生命周期,但实际上很多性能问题都来源于GC。我们可以通过对象复用的方式避免垃圾对象的产生,进而避免GC因对象回收导致的性能损失。对象池是对象复用的一种常用的方式。 阅读全文
posted @ 2021-08-24 09:59 Artech 阅读(4199) 评论(13) 推荐(23) 编辑
摘要: StatusCodePagesMiddleware中间件与ExceptionHandlerMiddleware中间件类似,它们都是在后续请求处理过程中“出错”的情况下利用一个错误处理器来接收针对当前请求的处理。它们之间的差异在于对“错误”的认定上:ExceptionHandlerMiddleware中间件所谓的错误就是抛出异常;StatusCodePagesMiddleware中间件则将400~599的响应状态码视为错误。 阅读全文
posted @ 2021-01-22 09:38 Artech 阅读(2320) 评论(3) 推荐(7) 编辑
摘要: DeveloperExceptionPageMiddleware中间件错误页面可以呈现抛出的异常和当前请求上下文的详细信息,以辅助开发人员更好地进行纠错诊断工作。ExceptionHandlerMiddleware中间件则主要面向最终用户,我们可以利用它来显示一个友好的定制化错误页面。 阅读全文
posted @ 2021-01-21 10:16 Artech 阅读(3443) 评论(7) 推荐(16) 编辑
摘要: 异常页面的DeveloperExceptionPageMiddleware中间件,该中间件在捕捉到后续处理过程中抛出的异常之后会返回一个媒体类型为text/html的响应,后者在浏览器上会呈现一个错误页面。由于这是一个为开发者提供诊断信息的异常页面,所以可以将其称为开发者异常页面(Developer Exception Page)。该页面不仅会呈现异常的详细信息(类型、消息和跟踪堆栈等),还会出现与当前请求相关的上下文信息 阅读全文
posted @ 2021-01-19 10:15 Artech 阅读(1123) 评论(0) 推荐(6) 编辑
摘要: NuGet包“Microsoft.AspNetCore.Diagnostics”中提供了几个与异常处理相关的中间件。当ASP.NET Core应用在处理请求过程中出现错误时,我们可以利用它们将原生的或者定制的错误信息作为响应内容发送给客户端。在着重介绍这些中间件之前,下面先演示几个简单的实例,从而使读者大致了解这些中间件的作用。 阅读全文
posted @ 2021-01-18 09:49 Artech 阅读(2889) 评论(1) 推荐(5) 编辑
摘要: AOP的本质是方法拦截(将针对目标方法调用劫持下来,进而执行执行的操作),置于方法拦截的实现方案,不外乎两种代码注入类型,即编译时的静态注入和运行时的动态注入,本篇文章列出了几种常用的动态注入方案。这篇文章的目标并不是提供完整的AOP框架的解决方案,而是说明各种解决方案后面的原理,所以我们提供的实例代码会尽可能简单 阅读全文
posted @ 2021-01-11 09:44 Artech 阅读(5601) 评论(20) 推荐(24) 编辑
摘要: 表示路由终结点的RouteEndpoint对象包含以RoutePattern对象表示的路由模式,某个请求能够被成功路由的前提是它满足某个候选终结点的路由模式所体现的路由规则。具体来说,这不仅要求当前请求的URL路径必须满足路由模板指定的路径模式,还需要具体的字符内容满足对应路由参数上定义的约束。 阅读全文
posted @ 2021-01-08 09:41 Artech 阅读(2364) 评论(1) 推荐(6) 编辑
摘要: 针对终结点的路由是由EndpointRoutingMiddleware和EndpointMiddleware这两个中间件协同完成的。应用在启动之前会注册若干表示终结点的Endpoint对象(具体来说是包含路由模式的RouteEndpoint对象)。当应用接收到请求并创建HttpContext上下文之后,EndpointRoutingMiddleware中间件会根据请求的URL及其他相关信息从注册的终结点中选择匹配度最高的那个。之后被选择的终结点会以一个特性(Feature)的形式附加到当前HttpContext上下文中,EndpointMiddleware中间件最终提供这个终结点并用它来处理当前请求。[ 阅读全文
posted @ 2021-01-07 08:44 Artech 阅读(2805) 评论(3) 推荐(15) 编辑
上一页 1 2 3 4 5 6 7 ··· 22 下一页