上一页 1 2 3 4 5 6 ··· 21 下一页
摘要: 针对控制台的ILogger实现类型为ConsoleLogger,对应的ILoggerProvider实现类型为ConsoleLoggerProvider,这两个类型都定义在 NuGet包“Microsoft.Extensions.Logging.Console”中。ConsoleLogger要将一条日志输出到控制台上,首选要解决的是格式化的问题,具体来说是如何将日志消息的内容荷载和元数据(类别、等级和事件ID等)格式化成呈现在控制台上的文本。针对日志的格式化由ConsoleFormatter对象来完成。 阅读全文
posted @ 2022-03-07 08:45 Artech 阅读(1238) 评论(0) 推荐(3) 编辑
摘要: 为了对各种日志框架进行整合,微软创建了一个用来提供统一的日志编程模式的日志框架。《日志的基本编程模式》以实例演示的方式介绍了日志的基本编程模式,现在我们来补充几种“进阶”用法。 阅读全文
posted @ 2022-03-04 09:06 Artech 阅读(1433) 评论(0) 推荐(3) 编辑
摘要: 《诊断跟踪的几种基本编程方式》介绍了四种常用的诊断日志框架。其实除了微软提供的这些日志框架,还有很多第三方日志框架可供我们选择,比如Log4Net、NLog和Serilog 等。虽然这些框架大都采用类似的设计,但是它们采用的编程模式具有很大的差异。为了对这些日志框架进行整合,微软创建了一个用来提供统一的日志编程模式的日志框架。( 阅读全文
posted @ 2022-03-03 08:55 Artech 阅读(1412) 评论(1) 推荐(7) 编辑
摘要: 一个好的程序员能够在系统出现问题之后马上定位错误的根源并找到正确的解决方案,一个更好的程序员能够根据当前的运行状态预知未来可能发生的问题,并将问题扼杀在摇篮中。诊断跟踪能够帮助我们有效地纠错和排错《几种基本诊断跟踪编程方式》提供了7个实例演示了针对TraceSource、EventSource和DiagnosticSource的基本用法,其实它们还具有一个更“高级”的使用方式。( 阅读全文
posted @ 2022-03-02 08:31 Artech 阅读(1384) 评论(2) 推荐(7) 编辑
摘要: 在整个软件开发维护生命周期内,最难的不是如何将软件系统开发出来,而是在系统上线之后及时解决遇到的问题。一个好的程序员能够在系统出现问题之后马上定位错误的根源并找到正确的解决方案,一个更好的程序员能够根据当前的运行状态预知未来可能发生的问题,并将问题扼杀在摇篮中。合理地利用诊断手段能够帮助我们有效地纠错和排错。 阅读全文
posted @ 2022-03-01 08:38 Artech 阅读(1347) 评论(2) 推荐(7) 编辑
摘要: 依赖注入使我们可以将依赖的功能定义成服务,最终以一种松耦合的形式注入消费该功能的组件或者服务中。除了可以采用依赖注入的形式消费承载某种功能的服务,还可以采用相同的方式消费承载配置数据的Options对象,这篇文章演示几种典型的编程模式。 阅读全文
posted @ 2022-02-28 09:44 Artech 阅读(1661) 评论(0) 推荐(8) 编辑
摘要: 我们倾向于将IConfiguration对象转换成一个具体的对象,以面向对象的方式来使用配置,我们将这个转换过程称为配置绑定。除了将配置树叶子节点配置节的绑定为某种标量对象外,我们还可以直接将一个配置节绑定为一个具有对应结构的符合对象。除此之外,配置绑定还支持针对数据、集合和字典类型的绑定。 阅读全文
posted @ 2022-02-25 08:31 Artech 阅读(694) 评论(5) 推荐(6) 编辑
摘要: .NET的配置支持多样化的数据源,我们可以采用内存的变量、环境变量、命令行参数、以及各种格式的配置文件作为配置的数据来源。在对配置系统进行系统介绍之前,我们通过几个简单的实例演示一下如何将具有不同来源的配置数据构建为一个统一的配置对象,并以相同的方式读取具体配置节的内容。 阅读全文
posted @ 2022-02-24 08:55 Artech 阅读(1412) 评论(1) 推荐(8) 编辑
摘要: ASP.NET Core应用具有很多读取文件的场景,如读取配置文件、静态Web资源文件(如CSS、JavaScript和图片文件等)、MVC应用的视图文件,以及直接编译到程序集中的内嵌资源文件。这些文件的读取都需要使用一个IFileProvider对象。IFileProvider对象构建了一个抽象的文件系统,我们不仅可以利用该系统提供的统一API来读取各种类型的文件,还能及时监控目标文件的变化。 阅读全文
posted @ 2022-02-23 08:53 Artech 阅读(1658) 评论(5) 推荐(2) 编辑
摘要: 作为《ASP.NET Core 3框架揭秘》的升级版,《ASP.NET Core 6框架揭秘》(6折优惠,首印送签名专属书签)提供了很多新的章节,同时对现有的内容进行大量的修改。虽然本书旨在对ASP.NET Core框架的架构设计和实现原理进行剖析,但是其中提供的258个实例演示却可以作为入门材料, 阅读全文
posted @ 2022-02-22 08:23 Artech 阅读(11383) 评论(7) 推荐(40) 编辑
摘要: 由于依赖注入具有举足轻重的作用,所以《ASP.NET Core 6框架揭秘》的绝大部分章节都会涉及这一主题。本书第3章对.NET原生的依赖注入框架的设计和实现进行了系统的介绍,其中设计一些“鲜为人知”的细节,其中一部分就体现在本篇提供的这几个实例演示上。 阅读全文
posted @ 2022-02-21 08:50 Artech 阅读(1921) 评论(14) 推荐(11) 编辑
摘要: 毫不夸张地说,整个ASP.NET Core就是建立在依赖注入框架之上的。ASP.NET Core应用在启动时构建管道所需的服务,以及管道处理请求使用到的服务,均来源于依赖注入容器。依赖注入容器不仅为ASP.NET Core框架自身提供必要的服务,还为应用程序提供服务,依赖注入已经成为ASP.NET Core应用的基本编程模式。 阅读全文
posted @ 2022-02-18 08:57 Artech 阅读(4922) 评论(11) 推荐(16) 编辑
摘要: ASP.NET Core框架建立在一个依赖注入框架之上,已注入的方式消费服务已经成为了ASP.NET Core基本的编程模式。为了使读者能够更好地理解原生的注入框架框架,我按照类似的设计创建了一个简易版本的依赖注入框架,并它命名为“Cat”。本篇提供的四个实例主要体现了针对Cat的用法,《一个Mini版的依赖注入框架》提供了针对设计和实现原理的介绍。 阅读全文
posted @ 2022-02-17 08:39 Artech 阅读(2261) 评论(1) 推荐(10) 编辑
摘要: 也许你们可能没有接触过Dapr,但是一定对它“有所耳闻”,感觉今年它一下子就火了,一时间很多人都在谈论它。我们从其命名(Dapr的全称是“分布式应用运行时Distributed Application Runtime”)可以看出Dapr的定位,它并不是分布式应用的开发框架,它提供的是更底层的“运行时”。我们可以使用不同的编程语言,采用不同的开发框架在这个由Dapr提供的运行时上面构建分布式应用 阅读全文
posted @ 2022-02-16 08:41 Artech 阅读(3776) 评论(5) 推荐(12) 编辑
摘要: ASP.NET Core可以视为一种底层框架,它为我们构建出了基于管道的请求处理模型,这个管道由一个服务器和多个中间件构成,而与路由相关的EndpointRoutingMiddleware和EndpointMiddleware是两个最为重要的中间件。MVC和gRPC开发框架就建立在路由基础上。本篇提供了四个实例用来演示如何利用路由、MVC和gRPC来开发API/APP。 阅读全文
posted @ 2022-02-15 08:24 Artech 阅读(5501) 评论(6) 推荐(23) 编辑
摘要: 作为《ASP.NET Core 3框架揭秘》的升级版,《ASP.NET Core 6框架揭秘》提供了很多新的章节,同时对现有的内容进行大量的修改。虽然本书旨在对ASP.NET Core框架的架构设计和实现原理进行剖析,但是其中提供的258个实例演示却可以作为入门材料,这个系列会将这些演示实例单独提取出来并进行汇总。对于想学习ASP.NET Core的同学,如果你觉得没有必要“砖的这么深”,倒是可以看看。 阅读全文
posted @ 2022-02-14 09:01 Artech 阅读(10053) 评论(23) 推荐(61) 编辑
摘要: 原则上所有的引用类型对象都可以通过对象池来提供,但是在具体的应用中需要权衡是否值得用。我们在使用之前得考虑当前场景是否适用对象池,在使用的时候严格按照“有借有还”、“不用才还”的原则。 阅读全文
posted @ 2021-08-26 08:30 Artech 阅读(3650) 评论(9) 推荐(22) 编辑
摘要: 《编程篇》已经涉及到了对象池模型的大部分核心接口和类型。对象池模型其实是很简单的,不过其中有一些为了提升性能而刻意为之的实现细节倒是值得我们关注。总的来说,对象池模型由三个核心对象构成,它们分别是表示对象池的ObjectPool对象、对象值提供者的ObjectPoolProvider对象,已及控制池化对象创建与释放行为的IPooledObjectPolicy对象 阅读全文
posted @ 2021-08-25 08:31 Artech 阅读(1818) 评论(9) 推荐(12) 编辑
摘要: 借助于有效的自动化垃圾回收机制,.NET让开发人员不在关心对象的生命周期,但实际上很多性能问题都来源于GC。我们可以通过对象复用的方式避免垃圾对象的产生,进而避免GC因对象回收导致的性能损失。对象池是对象复用的一种常用的方式。 阅读全文
posted @ 2021-08-24 09:59 Artech 阅读(3235) 评论(13) 推荐(23) 编辑
摘要: StatusCodePagesMiddleware中间件与ExceptionHandlerMiddleware中间件类似,它们都是在后续请求处理过程中“出错”的情况下利用一个错误处理器来接收针对当前请求的处理。它们之间的差异在于对“错误”的认定上:ExceptionHandlerMiddleware中间件所谓的错误就是抛出异常;StatusCodePagesMiddleware中间件则将400~599的响应状态码视为错误。 阅读全文
posted @ 2021-01-22 09:38 Artech 阅读(1819) 评论(3) 推荐(7) 编辑
摘要: DeveloperExceptionPageMiddleware中间件错误页面可以呈现抛出的异常和当前请求上下文的详细信息,以辅助开发人员更好地进行纠错诊断工作。ExceptionHandlerMiddleware中间件则主要面向最终用户,我们可以利用它来显示一个友好的定制化错误页面。 阅读全文
posted @ 2021-01-21 10:16 Artech 阅读(2749) 评论(7) 推荐(16) 编辑
摘要: 异常页面的DeveloperExceptionPageMiddleware中间件,该中间件在捕捉到后续处理过程中抛出的异常之后会返回一个媒体类型为text/html的响应,后者在浏览器上会呈现一个错误页面。由于这是一个为开发者提供诊断信息的异常页面,所以可以将其称为开发者异常页面(Developer Exception Page)。该页面不仅会呈现异常的详细信息(类型、消息和跟踪堆栈等),还会出现与当前请求相关的上下文信息 阅读全文
posted @ 2021-01-19 10:15 Artech 阅读(938) 评论(0) 推荐(6) 编辑
摘要: NuGet包“Microsoft.AspNetCore.Diagnostics”中提供了几个与异常处理相关的中间件。当ASP.NET Core应用在处理请求过程中出现错误时,我们可以利用它们将原生的或者定制的错误信息作为响应内容发送给客户端。在着重介绍这些中间件之前,下面先演示几个简单的实例,从而使读者大致了解这些中间件的作用。 阅读全文
posted @ 2021-01-18 09:49 Artech 阅读(2287) 评论(1) 推荐(5) 编辑
摘要: AOP的本质是方法拦截(将针对目标方法调用劫持下来,进而执行执行的操作),置于方法拦截的实现方案,不外乎两种代码注入类型,即编译时的静态注入和运行时的动态注入,本篇文章列出了几种常用的动态注入方案。这篇文章的目标并不是提供完整的AOP框架的解决方案,而是说明各种解决方案后面的原理,所以我们提供的实例代码会尽可能简单 阅读全文
posted @ 2021-01-11 09:44 Artech 阅读(4950) 评论(20) 推荐(24) 编辑
摘要: 表示路由终结点的RouteEndpoint对象包含以RoutePattern对象表示的路由模式,某个请求能够被成功路由的前提是它满足某个候选终结点的路由模式所体现的路由规则。具体来说,这不仅要求当前请求的URL路径必须满足路由模板指定的路径模式,还需要具体的字符内容满足对应路由参数上定义的约束。 阅读全文
posted @ 2021-01-08 09:41 Artech 阅读(2007) 评论(1) 推荐(6) 编辑
摘要: 针对终结点的路由是由EndpointRoutingMiddleware和EndpointMiddleware这两个中间件协同完成的。应用在启动之前会注册若干表示终结点的Endpoint对象(具体来说是包含路由模式的RouteEndpoint对象)。当应用接收到请求并创建HttpContext上下文之后,EndpointRoutingMiddleware中间件会根据请求的URL及其他相关信息从注册的终结点中选择匹配度最高的那个。之后被选择的终结点会以一个特性(Feature)的形式附加到当前HttpContext上下文中,EndpointMiddleware中间件最终提供这个终结点并用它来处理当前请求。[ 阅读全文
posted @ 2021-01-07 08:44 Artech 阅读(2005) 评论(3) 推荐(13) 编辑
摘要: 本章介绍的是最早发布于ASP.NET Core 2.2中的新路由系统,由于它采用基于终结点映射的策略,所以我们将其称为终结点路由。终结点路由自然以终结点为核心,所以先介绍终结点在路由系统中的表现形式。 阅读全文
posted @ 2021-01-06 10:11 Artech 阅读(2524) 评论(1) 推荐(6) 编辑
摘要: 一个Web应用本质上体现为一组终结点的集合。终结点则体现为一个暴露在网络中可供外界采用HTTP协议调用的服务,路由的作用就是建立一个请求URL模式与对应终结点之间的映射关系。借助这个映射关系,客户端可以采用模式匹配的URL来调用对应的终结点。对于路由系统来说,作为路由目标的终结点总是关联一个具体的URL路径模式,我们将其称为路由模式(Route Pattern)。 阅读全文
posted @ 2021-01-05 08:44 Artech 阅读(1660) 评论(1) 推荐(11) 编辑
摘要: 借助路由系统提供的请求URL模式与对应终结点(Endpoint)之间的映射关系,我们可以将具有相同URL模式的请求分发给应用的终结点进行处理。ASP.NET Core的路由是通过EndpointRoutingMiddleware和EndpointMiddleware这两个中间件协作完成的,它们在ASP.NET Core平台上具有举足轻重的地位,因为ASP.NET Core MVC框架就建立在这个中间件之上。 阅读全文
posted @ 2021-01-04 08:59 Artech 阅读(2445) 评论(2) 推荐(7) 编辑
摘要: 对于NuGet包由“Microsoft.AspNetCore.StaticFiles”提供的3个中间件来说,StaticFileMiddleware中间件旨在处理针对具体静态文件的请求,其他两个中间件(DirectoryBrowserMiddleware和DefaultFilesMiddleware)处理的均是针对某个目录的请求。 阅读全文
posted @ 2020-12-21 08:59 Artech 阅读(755) 评论(0) 推荐(7) 编辑
摘要: 上面的实例演示(搭建文件服务器、条件请求以提升性能和区间请求以提供部分内容)从提供的功能和特性的角度对StaticFileMiddleware中间件进行了全面的介绍,下面从实现原理的角度对这个中间件进行全面解析。 阅读全文
posted @ 2020-12-18 09:09 Artech 阅读(1217) 评论(1) 推荐(7) 编辑
摘要: 大部分针对物理文件的请求都希望获取整个文件的内容,区间请求则与之相反,它希望获取某个文件部分区间的内容。区间请求可以通过多次请求来获取某个较大文件的全部内容,并实现断点续传。如果同一个文件同时存放到多台服务器,就可以利用区间请求同时下载不同部分的内容。与条件请求一样,区间请求也作为标准定义在HTTP规范之中。 阅读全文
posted @ 2020-12-17 09:17 Artech 阅读(841) 评论(0) 推荐(4) 编辑
摘要: StaticFileMiddleware中间件最终利用IFileProvider对象读取文件的内容,并将其作为响应报文的主体。实际上,这个中间件在处理请求时所做的事情比前面的演示实例多,比如针对条件请求(Conditional Request)和区间请求(Range Request)的处理就没有体现在上面演示的实例中。 阅读全文
posted @ 2020-12-16 10:57 Artech 阅读(1245) 评论(2) 推荐(5) 编辑
摘要: 虽然ASP.NET Core是一款“动态”的Web服务端框架,但是由它接收并处理的大部分是针对静态文件的请求,最常见的是开发Web站点使用的3种静态文件(JavaScript脚本、CSS样式和图片)。ASP.NET Core提供了3个中间件来处理针对静态文件的请求,利用它们不仅可以将物理文件发布为可以通过HTTP请求获取的Web资源,还可以将所在的物理目录的结构呈现出来。 阅读全文
posted @ 2020-12-15 08:53 Artech 阅读(4162) 评论(14) 推荐(24) 编辑
摘要: 要承载一个ASP.NET Core应用,只需要将GenericWebHostService服务注册到承载系统中即可。但GenericWebHostService服务具有针对其他一系列服务的依赖,所以在注册该承载服务之前需要先完成对这些依赖服务的注册。针对GenericWebHostService及其依赖服务的注册是借助GenericWebHostBuilder对象来完成的。 阅读全文
posted @ 2020-12-03 09:00 Artech 阅读(982) 评论(0) 推荐(8) 编辑
摘要: 我们知道ASP.NET Core应用的请求处理管道是由一个IServer对象和IHttpApplication对象构成的。我们可以根据需要注册不同类型的服务器,但在默认情况下,IHttpApplication是一个HostingApplication对象。一个HostingApplication对象由指定的RequestDelegate对象来完成所有的请求处理工作,而后者代表所有中间件按照注册的顺序串联而成的委托链。所有的这一切都被GenericWebHostService整合在一起. 阅读全文
posted @ 2020-12-02 09:17 Artech 阅读(1599) 评论(0) 推荐(4) 编辑
摘要: ASP.NET Core应用默认的请求处理管道是由注册的IServer对象和HostingApplication对象组成的,后者利用一个在创建时提供的RequestDelegate对象来处理IServer对象分发给它的请求。而RequestDelegate对象实际上是由所有的中间件按照注册顺序创建的。换句话说,这个RequestDelegate对象是对中间件委托链的体现。 阅读全文
posted @ 2020-11-30 09:00 Artech 阅读(1636) 评论(0) 推荐(7) 编辑
摘要: 在前两篇文章中,我们先后介绍了CallContext(IllogicalCallContext和LogicalCallContext)、AsyncLocal和SynchronizationContext,它们都是线程执行上下文的一部分。本篇介绍的安全上下文(SecurityContext)同样是执行上下文的一部分,它携带了的身份和权限相关的信息决定了执行代码拥有的控制权限。 阅读全文
posted @ 2020-11-27 09:04 Artech 阅读(3403) 评论(7) 推荐(12) 编辑
摘要: 一般情况下,我们可以将某项操作分发给任意线程来执行,但有的操作确实对于执行的线程是有要求的,最为典型的场景就是:GUI针对UI元素的操作必须在UI主线程中执行。将指定的操作分发给指定线程进行执行的需求可以通过同步上下文(SynchronizationContext)来实现。你可能从来没有使用过SynchronizationContext,但是在基于Task的异步编程中,它却总是默默存在。今天我们就来认识一下这个SynchronizationContext对象。 阅读全文
posted @ 2020-11-26 08:38 Artech 阅读(2014) 评论(4) 推荐(15) 编辑
摘要: 线程是操作系统能够进行运算调度的最小单位,操作系统线程进一步被封装成托管的Thread对象,手工创建并管理Thread对象已经成为了所能做到的对线程最细粒度的控制了。后来我们有了ThreadPool,可以更加方便地以池化的方式来使用线程。最后,Task诞生,它结合async/await关键字给与我们完美异步编程模式。但这一切让我们的编程体验越来越好,但是离线程的本质越来越远。被系列文章从“执行上下文传播”这个令开发者相对熟悉的角度来聊聊重新认识我们似乎已经很熟悉的主题。 阅读全文
posted @ 2020-11-25 09:26 Artech 阅读(3198) 评论(9) 推荐(27) 编辑
上一页 1 2 3 4 5 6 ··· 21 下一页