IT博客汇
首页
精华
技术
设计
资讯
扯淡
权利声明
登录
注册
相关标签
作者:
Artech
409
source
关注
TA的标签:
web
asp
相关
api
揭秘
样章
框架
本书
host
mvc
artech
world
net
应用
hello
love
0
Artech
发表于
2024-08-23 00:35:00
除了按值和引用,方法参数的第三种传递方式 - Artech
【摘要】参数在方法种具有按“值(by value)”和“引用(by ref)”两种传递方式,这是每个.NET程序员深入骨髓得基本概念。但是我若告诉你,.NET规定的参数传递形式其实是三种,会不会颠覆你的认知。阅读全文 ...
继续阅读 (32)
love
0
Artech
发表于
2024-08-20 00:46:00
方法的三种调用形式 - Artech
【摘要】在《可以调用Null的实例方法吗?》一文中,我谈到.NET方法的三种调用形式,现在我们就来着重聊聊这个话题。具体来说,这里所谓的三种方法调用形式对应着三种IL指令:Call、CallVirt和Calli。阅读全文 ...
继续阅读 (24)
love
0
Artech
发表于
2024-08-19 01:43:00
可以调用Null的实例方法吗? - Artech
【摘要】前几天有个网友问我一个问题:调用实例方法的时候为什么目标对象不能为Null。看似一个简单的问题,还真不是一句话就能说清楚的。而且这个结论也不对,当我们调用定义在某个类型的实例方法时,目标对象其实可以为Null。阅读全文 ...
继续阅读 (27)
love
0
Artech
发表于
2024-03-19 00:33:00
自定义Key类型的字典无法序列化的N种解决方案 - Artech
【摘要】当我们使用System.Text.Json.JsonSerializer对一个字典对象进行序列化的时候,默认情况下字典的Key不能是一个自定义的类型,本文介绍几种解决方案。阅读全文 ...
继续阅读 (47)
love
0
Artech
发表于
2024-03-18 03:51:00
为什么ASP.NET Core的路由处理器可以使用一个任意类型的Delegate - Artech
【摘要】毫不夸张地说,路由是ASP.NET Core最为核心的部分。路由的本质就是注册一系列终结点(Endpoint),每个终结点可以视为“路由模式”和“请求处理器”的组合,它们分别用来“选择”和“处理”请求。请求处理器通过RequestDelegate来表示,但是当我们在进行路由编程的时候,却可以使用任意类型的Delegate作为处理器器,这一切的背后是如何实现的呢?阅读全文 ...
继续阅读 (57)
love
0
Artech
发表于
2024-03-06 00:56:00
深入解析ASP.NET Core MVC的模块化设计[下篇] - Artech
【摘要】ASP.NET Core MVC的“模块化”设计使我们可以构成应用的基本单元Controller定义在任意的模块(程序集)中,并在运行时动态加载和卸载。《设计篇》介绍了这种为“飞行中的飞机加油”的方案的实现原理?本篇我们将演示将介绍“分散定义Controller”的N种实现方案。源代码从这里下载。阅读全文 ...
继续阅读 (36)
love
0
Artech
发表于
2024-03-05 00:44:00
深入解析ASP.NET Core MVC应用的模块化设计[上篇] - Artech
【摘要】ASP.NET Core MVC的“模块化”设计使我们可以构成应用的基本单元Controller定义在任意的模块(程序集)中,并在运行时动态加载和卸载。这种为“飞行中的飞机加油”的方案是如何实现的呢?该系列的两篇文章将关注于这个主题,本篇着重介绍“模块化”的总体设计,下篇我们将演示将介绍“分散定义Controller”的N种实现方案。阅读全文 ...
继续阅读 (49)
love
0
Artech
发表于
2024-02-29 01:56:00
ASP.NET Core MVC应用模型的构建[4]: Action的选择 - Artech
【摘要】ControllerModel类型的Actions属性包含一组描述有效Action方法的ActionModel对象。对于定义在Controller类型中的所有方法,究竟哪些方法才能成为有效的Action方法呢?所以在正式介绍ActionModel类型之前,我们先来聊聊Action方法的选择规则。阅读全文 ...
继续阅读 (40)
love
0
Artech
发表于
2024-02-28 01:37:00
ASP.NET Core MVC应用模型的构建[3]: Controller的收集 - Artech
【摘要】从编程的角度来看,一个MVC应用是由一系列Controller类型构建而成的,所以对于一个代表应用模型的ApplicationModel对象来说,它的核心就是Controllers属性返回的一组ControllerModel对象,每个ControllerModel对象是应用模型针对Controller类型的描述。阅读全文 ...
继续阅读 (51)
love
0
Artech
发表于
2024-02-27 00:25:00
ASP.NET Core MVC应用模型的构建[2]: 定制应用模型 - Artech
【摘要】在对应用模型的基本构建方式具有大致的了解之后,我们来系统地认识一下描述应用模型的ApplicationModel类型。对于一个描述MVC应用模型的ApplicationModel对象来说,它承载的元数据绝大部分是由默认注册的DefaultApplicationModelProvider对象提供的,在接下来针对ApplicationModel及其相关类型(ControllerModel、ActionModel和ParameterModel等)的介绍中,我们还会着重介绍DefaultApplicationModelProvider对象采用怎样的方式提取并设置这些元数据。阅读全文 ...
继续阅读 (68)
love
0
Artech
发表于
2024-02-26 00:14:00
ASP.NET Core MVC应用模型的构建[1]: 应用的蓝图 - Artech
【摘要】我个人觉得这是ASP.NET Core MVC框架体系最核心的部分。原因很简单,MVC框架建立在ASP.NET Core路由终结点上,它最终的目的就是将每个Action方法映射为一个或者多个路由终结点,路由终结点根据附加在Action上的若干元数据构建而成。为了构建描述当前应用所有Action的元数据,MVC框架会提取出定义在当前应用范围内的所有Controller类型,并进一步构建出基于Controller的应用模型。应用模型不仅仅是构建Action元数据的基础,承载API的应用还可以利用它自动生成API开发文档,一些工具甚至可以利用应用模型自动生成消费API的客户端代码。阅读全文 ...
继续阅读 (59)
love
0
Artech
发表于
2024-02-20 00:13:00
基于HTTP2/3的流式请求/响应如何实现? - Artech
【摘要】我想很多人已经体验过GRPC提供的三种流式消息交换模式,在.NET Core上构建的GRPC应用本质上是采用HTTP2/HTTP3协议的ASP.NET Core应用,我们当然也可以在一个普通的ASP.NET Core应用实现这些流模式。不仅如此,HttpClient也提供了响应的支持,这篇文章通过一个简单的实例提供了相应的实现阅读全文 ...
继续阅读 (51)
love
0
Artech
发表于
2024-02-19 00:07:00
编写高效的代码,你应该了解Array、Memory、ReadOnlySequence - Artech
【摘要】针对“缓冲区”编程是一个非常注重“性能”的地方,我们应该尽可能地避免武断地创建字节数组来存储读取的内容,这样不但会导致大量的字节拷贝,临时创建的字节数组还会带来GC压力。要正确、高效地读写缓冲内容,我们应该对几个我们可能熟悉的类型具有更深的认识。阅读全文 ...
继续阅读 (50)
love
0
Artech
发表于
2024-02-05 01:42:00
WebAssembly核心编程[4]: Memory - Artech
【摘要】由于Memory存储的是单纯的二进制字节,所以原则上我们可以用来它作为媒介,在wasm模块和数组程序之间传递任何类型的数据。在JavaScript API中,Memory通过WebAssembly.Memory类型表示,我们一般将它内部的缓冲区映射相应类型的数组进行处理。WebAssembly也提供了相应的指令来提供针对Memory的读、写、扩容等操作阅读全文 ...
继续阅读 (74)
love
0
Artech
发表于
2024-02-02 01:39:00
WebAssembly核心编程[3]: Module 与 Instance - Artech
【摘要】WebAssembly程序总是以模块来组织,模块是基本的部署、加载和编译单元。在JavaScript编程接口中,模块通过WebAssembly.Module类型表示。WebAssembly.Module通过加载的.wasm二进制文件创建而成,它承载了描述wasm模块的元数据,类似于描述程序集的Assembly对象。WebAssembly.Module自身是只读且无状态的,有状态的是根据它结合指定的导入对象创建的模块实例,后者通过WebAssembly.Instance表示。这两个类型提供了几个核心API,解析我们就通过它们来介绍WebAssembly的这两个核心对象。阅读全文 ...
继续阅读 (54)
love
0
Artech
发表于
2024-02-01 00:33:00
WebAssembly核心编程[2]:类型系统 - Artech
【摘要】对于绝大多数编程语言来说,类型都是编程的基础,WebAssembly自然也不例外。总的来说,WebAssembly涉及的类型不多,很好掌握,接下来我们就来介绍一下WebAssembly编程涉及到的几种类型。本篇内容参考WebAssembly Spec。阅读全文 ...
继续阅读 (68)
love
0
Artech
发表于
2024-01-31 00:37:00
WebAssembly核心编程[1]:wasm模块实例化的N种方式 - Artech
【摘要】当我们在一个Web应用中使用WebAssembly,最终的目的要么是执行wasm模块的入口程序(通过start指令指定的函数),要么是调用其导出的函数,这一切的前提需要创建一个通过WebAssembly.Instance对象表示的wasm模块实例(源代码)。阅读全文 ...
继续阅读 (52)
love
0
Artech
发表于
2024-01-30 00:33:00
WebAssembly入门笔记[4]:利用Global传递全局变量 - Artech
【摘要】利用WebAssembly的导入导出功能可以灵活地实现宿主JavaScript程序与加载的单个wasm模块之间的交互,那么如何在宿主程序与多个wasm之间传递和共享数据呢?这就需要使用到Global这个重要的对象了。阅读全文 ...
继续阅读 (64)
love
0
Artech
发表于
2024-01-29 00:35:00
WebAssembly入门笔记[3]:利用Table传递引用 - Artech
【摘要】在《WebAssembly入门笔记[2]》中,我们介绍了如何利用Memory在作为宿主的JavaScript应用和wasm模块之间传递数据,但是Memory面向单纯二进制字节的读写在使用起来还是不太方便,此时我们会更多地用到另一个重要的对象Table。Table利用用来存储一组指定类型的对象,说得准确一点是对象的引用,所以可以读取出来直接消费。阅读全文 ...
继续阅读 (55)
love
0
Artech
发表于
2024-01-26 00:40:00
WebAssembly入门笔记[2]:利用Memory传递数据 - Artech
【摘要】利用灵活的“导入”和“导出”机制,WebAssembly与承载的JavaScript应用之间可以很便利地“互通有无”。《与JavaScript的交互》着重演示了如何利用函数的导入和导出实现功能的共享,接下来我们主要关注数据的传递或者共享。宗地来说,WebAssembly与宿主程序之间的数据传递主要有如下三种手段,本篇文章主要关注Memory。阅读全文 ...
继续阅读 (83)
love
0
Artech
发表于
2024-01-25 00:27:00
WebAssembly入门笔记[1]:与JavaScript的交互 - Artech
【摘要】前一阵子利用Balazor开发了一个NuGet站点,对WebAssembly进行了初步的了解,觉得挺有意思。在接下来的一系列文章中,我们将通过实例演示的方式介绍WebAssembly的一些基本概念和编程模式。阅读全文 ...
继续阅读 (66)
love
0
Artech
发表于
2023-11-08 00:31:00
模拟ASP.NET Core MVC设计与实现 - Artech
【摘要】前几天有人在我的《ASP.NET Core框架揭秘》读者群跟我留言说:“我最近在看ASP.NET Core MVC的源代码,发现整个系统太复杂,涉及的东西太多,完全找不到方向,你能不能按照《200行代码,7个对象——让你了解ASP.NET Core框架的本质》这篇文章思路剖析一下MVC框架”,今天我们就来试试看。阅读全文 ...
继续阅读 (69)
love
0
Artech
发表于
2023-11-07 00:11:00
.NET的各种对象在内存中如何布局[博文汇总] - Artech
【摘要】在过去一段时间里,我陆陆续续写一些关于.NET对象类型布局的文章,其中包括值类型和引用类型的内存布局、字符串对象和数组的内存布局等,这里作一个简单的汇总。阅读全文 ...
继续阅读 (79)
love
0
Artech
发表于
2023-11-06 00:29:00
NativeBuffering,一种高性能、零内存分配的序列化解决方案[性能测试续篇] - Artech
【摘要】在《NativeBuffering,一种高性能、零内存分配的序列化解决方案[性能测试篇]》我比较了NativeBuffering和System.Text.Json两种序列化方式的性能,通过性能测试结果可以看出NativeBuffering具有非常明显的优势,有的方面的性能优势甚至是“碾压式”的,唯独针对字符串的序列化性能不够理想。我趁这个周末对此做了优化,解决了这块短板,接下来我们就来看看最新的性能测试结果和背后“加速”的原理。阅读全文 ...
继续阅读 (96)
love
0
Artech
发表于
2023-11-03 00:22:00
实现一个极简的字节数组对象池 - Artech
【摘要】.NET利用ArrayPoolPool和MemoryPool提供了针对Array/Memory的对象池功能。最近在一个项目中需要使用到针对字节数组的对象池,由于这些池化的字节数组相当庞大,我希望将它们分配到POH上以降低GC的压力。由于ArrayPoolPool没法提供支持,阅读全文 ...
继续阅读 (88)
love
0
Artech
发表于
2023-11-02 01:46:00
NativeBuffering,一种高性能、零内存分配的序列化解决方案[性能测试篇] - Artech
【摘要】第一版的NativeBuffering([上篇]、[下篇])发布之后,我又对它作了多轮迭代,对性能作了较大的优化。比如确保所有类型的数据都是内存对齐的,内部采用了池化机器确保真正的“零内存分配”等。对于字典类型的数据成员,原来只是“表现得像个字段”,这次真正使用一段连续的内存构架了一个“哈希表”。我们知道对于每次.NET新版本的发布,原生的JSON序列化(System.Text.Json)的性能都作了相应的提升,本篇文章通过具体的性能测试比较NativeBuffering和它之间的性能差异。阅读全文 ...
继续阅读 (89)
love
0
Artech
发表于
2023-11-01 00:29:00
两种基于时间窗口的限流器的简单实现 - Artech
【摘要】之前开发的一款基于OpenTelemetry的Tracing组件需要使用基于速率限制(Rate Limiting)的跟踪采样策略,本想使用现有的解决方案,比如System.Threading.RateLimiting命名空间下的RateLimiter。大体看了RateLimiter的三种实现(固定窗口、滑动窗口和令牌桶),觉得过于相对复杂了点,代码还涉及到锁,而且提供的功能我也不太需要,于是尝试实现一种简单的、无锁解决方案。阅读全文 ...
继续阅读 (81)
love
0
Artech
发表于
2023-10-31 00:44:00
利用一段字节序列构建一个数组对象 - Artech
【摘要】《.NET中的数组在内存中如何布局? 》介绍了一个.NET下针对数组对象的内存布局。既然我们知道了内存布局,我们自然可以按照这个布局规则创建一段字节序列来表示一个数组对象。阅读全文 ...
继续阅读 (101)
love
0
Artech
发表于
2023-10-30 00:50:00
.NET中的数组在内存中如何布局? - Artech
【摘要】总的来说,.NET的值类型和引用类型都映射一段连续的内存片段。就内存布局来说,引用类型有两个独特的存在,一个是字符串,另一个就是数组。今天我们来聊聊数组类型的内存布局。阅读全文 ...
继续阅读 (71)
love
0
Artech
发表于
2023-08-01 00:30:00
NativeBuferring,一种零分配的数据类型[下篇] - Artech
【摘要】上文说到Unmanaged、BufferedBinary和BufferedString是NativeBuffering支持的三个基本数据类型,其实我们也可以说NativeBuffering只支持Unmanaged和IReadOnlyBufferedObject阅读全文 ...
继续阅读 (96)
1/7
下一页