- 博客(472)
- 资源 (2)
- 收藏
- 关注
原创 c#联合类型,解决响应接口返回结果有多重变体
不同版本的 ASP.NET Core 和 OpenAPI 工具链,对多态类型的 schema 生成能力参差不齐,能不能产出带 discriminator mapping 的 oneOf 结构,别想当然,打开生成的文档亲自核对。说句公道话,联合类型不是银弹。一份合格的联合类型契约,至少要说清楚:有哪几种 JSON 形态、kind 的取值、每种结果对应的状态码,以及客户端遇到未知 kind 时该怎么办。只是告诉序列化器“有哪些类型”,JSON 里的值对不对、金额是不是负数,它一概不管,业务校验一行都不能省。
2026-10-10 15:37:11
181
原创 轻量级的web api框架
FastEndpoints 是构建在 ASP.NET Core 管道之上的轻量 Web API 框架,核心是(Request–Endpoint–Response):一个 HTTP 接口 = 一个 Endpoint 类,自带 Request/Response DTO、FluentValidation 验证、依赖注入和 Swagger 支持。它定位介于传统 MVC Controller 和 Minimal API 之间——比 Controller 轻、比 Minimal API 好维护。
2026-09-29 17:35:48
30
原创 .net core服务限流解决方案
这个区别决定了它们对"突发"的态度完全不同。固定窗口计数在窗口切换的瞬间会放行(窗口末尾 100 次 + 窗口开头 100 次 = 200 次挤在一瞬间),而你的服务只扛得住 100 —— 这就是它最致命的问题。
2026-09-28 09:22:37
44
原创 探讨c# vue实现前端路由和界面按钮权限做表配置
—通常叫。你要的"配置界面"在成熟框架里就是「菜单管理 + 角色管理」两个页面,菜单、路由、按钮全在数据库里配,前端不再写死路由表。
2026-09-22 11:52:17
119
原创 .NET 使用 Refit 构建声明式 HTTP 客户端:从入门到生产实践
Refit 的价值不在"少写几行代码",而在于把 API 契约变成了一等公民——它集中、可见、可编译期校验、可测试。接口即契约、即文档。 新增一个端点就是加一行方法。Refit 只管生成调用,连接生命周期交给 HttpClientFactory。预期内的失败用分支处理,异常只留给真正的意外。从"把现有 HttpClient 代码里最啰嗦的那几个接口改成 Refit 接口"开始试,你会很快体会到差别。码字不易,如果您觉得我的文章对您有帮助的话,烦请您打赏一元,我买瓶水喝;
2026-09-19 14:02:27
460
原创 C# 界面卡顿:从定位到根治
界面卡顿这事,定位比优化重要。绝大多数卡顿不需要高深算法——要么是重活干错了线程,要么是死锁,要么是刷新太频繁。先用看门狗把"卡多久"量化出来,再用探查器抓到那一条阻塞栈,问题基本就解决了一半。UI 线程只做两件事:更新控件、分发命令。await 一路到底,绝不 .Result。后台多快都行,UI 定频出帧。码子不易,如果您觉得我的文章对您有帮助的话,烦请您打赏一元,我买瓶水喝;
2026-09-18 18:08:52
483
原创 c#上位机开发如何使代码更健壮
要让 C# 上位机代码更健壮,不能只靠写几个 try-catch。异常有兜底、资源有释放、通信有超时重试;线程安全用合理的数据结构,UI 不卡不假死;状态用状态机管理,配置不写死;日志全量记录,看门狗自动恢复;解析协议先校验后解码,模块解耦依赖注入;再加上单元测试和规范部署。即使出现了 bug,系统也能自动恢复、留下线索、让操作者知道发生了什么,在最短时间内重新投入运行。码子不易,如果您觉得我的文章对您有帮助的话,烦请您打赏一元,我买瓶水喝;
2026-09-18 14:35:40
306
原创 KingSCADA 学习总览
这是一份系统的 KingSCADA 学习大纲,从入门到工程落地,分七个阶段。每个阶段包含目标、核心内容、练习任务,并在关键处标注版本差异。
2026-09-17 15:54:59
92
原创 kingscada是什么 能做什么
KINGSCADA 通常指,一套国产中高端 SCADA(数据采集与监视控制)组态平台,用来把现场 PLC/仪表/RTU 的数据采上来、做画面监控、报警、历史存储和远程调度。它定位高于亚控自家的“组态王/KingView”,更偏厂级、集团级、跨厂区和大点位项目。
2026-09-16 14:06:09
210
原创 手写观察者模式:C#上位机状态通知的优雅解法
定义:定义对象间一种一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都会收到通知并自动更新。两个核心角色:角色别名职责Subject主题 / 被观察者 / 发布者维护观察者列表,提供注册/注销,状态变化时通知Observer观察者 / 订阅者定义接收通知的接口(Update 方法)注册(Attach)→ 变化 → 通知(Notify)。观察者模式的本质,是把"谁关心我变了"这个问题,从「编译期硬编码」变成「运行期动态注册」。简单场景用event(语言级、够用);
2026-09-11 16:45:42
517
原创 C#上位机必备:生产者-消费者模式与消息队列,从入门到实战
想象一个场景:你在食堂打饭。•厨师(生产者)不停炒菜,把菜放到窗口•窗口(消息队列)放着做好的菜,作为缓冲•你(消费者)端起盘子打菜吃饭厨师不用等你吃完才炒下一盘,你也不用等厨师炒完才开始吃。各干各的,互不等待——这就是生产者-消费者模式的核心思想。放到上位机里就是:•生产者:串口 / TCP 采集线程,从 PLC、传感器读数据•消息队列:内存中的缓冲区,存原始数据帧•消费者:解析、存储、UI 显示线程,按自己的节奏处理数据为什么一定要用消息队列?四个理由:1.解耦。
2026-09-09 09:34:37
437
原创 ASP.NET Core 8 Minimal API 认证示例,核心用 BCrypt.Net 做密码哈希 + JWT 做身份认证。
return Results.Ok(new { username = name, message = "已通过认证,这是你的个人数据" });Console.WriteLine($"但都能校验通过: {BCrypt.Verify(password, hash2)}");return Results.BadRequest(new { message = "用户名和密码不能为空" });// 内存用户仓储(演示用,生产请换 EF Core + 数据库)// ===== 4. 受保护接口(需 JWT)=====
2026-09-08 09:24:28
212
原创 BCrypt.Net是做什么的
BCrypt.Net 是 .NET 里用来“安全哈希用户密码”的库——它把 bcrypt 算法封装成简单 API,自动加盐、支持可调慢度,让开发者无需自己处理加密细节,就能合规、抗暴破地存储密码。
2026-09-08 09:15:05
19
原创 推荐一款.net 日志格式化插件RuoVea.ExLog
/ 按类型获取日志操作对象_log.Info($"处理付款: {amount:C}");_log.Debug($"付款明细: ...");// 按字符串名称获取日志操作对象orderLog.Warn("订单模块: 检测到重复提交");orderLog.Error("订单模块: 回调验签失败");通过GetLogger获取的Log对象仍然是log4netILog的轻量包装,不持有线程池调度逻辑(即同步写入 log4net,而非Task.Run调度)。如果追求异步写入,请使用。
2026-09-07 08:54:13
213
原创 C# 调用 .NET(Core)Web 服务混用:常见问题与 .NET 6~10 正确写法
C# 混合调用 .NET(Core)Web 服务的核心规则是“进程边界隔离 + 契约层下沉到 netstandard2.0”:.NET Framework 端通过HttpClient调用运行在 net6~net10 上的 ASP.NET Core 服务;Web 服务自 .NET 6 起统一使用 Minimal Hosting(app.Run()),.NET 8 引入 Keyed DI 与 TimeProvider、.NET 9 加入与 LINQ 新算子、.NET 10 正式支持 C# 14field。
2026-09-05 10:31:44
603
原创 推荐一款.net 配置类库RuoVea.ExConfig
Configset;set;set;set;set;set;set;set;set;set;
2026-09-04 10:02:46
82
原创 推荐一款.net SqlSugar ORM 一站式扩展库 RuoVea.ExSugar
集成 DI 注册、DbContext/Repository 模式、审计字段自动填充、全局查询过滤器、工作单元事务、差异日志记录、SM2 连接字符串加密,覆盖从 DataExecuting AOP 到分页查询的完整数据访问层抽象。为 .NET 开发者提供 SqlSugar ORM 的开箱即用增强封装,通过 DI 容器统一管理数据库连接、审计字段、查询过滤器和事务边界。建议通过环境变量、密钥管理服务(如 Azure Key Vault)或加密的配置文件注入。重载以启用完整功能(差异日志、过滤器等)。
2026-09-03 14:28:22
414
原创 推荐一款.net工具RuoVea.ExUtil
/ 当前 UTC+8 区 Unix 时间戳(秒)// Unix 时间戳 → DateTime// DateTime → Unix 时间戳(秒)⚠️已知缺陷硬编码,仅适用于 UTC+8(中国时区)场景,非东八区环境需自行处理。文件: Validate/Attributes/EmailAttribute.cs构造参数: msg(自定义错误消息)实际: 构造函数接收 msg 参数后未使用,始终返回硬编码的英文错误消息。
2026-09-03 08:58:43
353
原创 C# 使用 FreeSql 深度指南:重点拆解内核逻辑
FreeSql 是国产 .NET ORM(作者 dotnetcore/2881099),定位与 EF Core 不同——。本文不堆砌 CRUD 示例,重点放在。
2026-09-02 09:46:08
339
原创 AI现在能写大部分场景的代码,程序员应如何做才能保证自己不被淘汰
AI 时代的核心竞争力,不是"写代码更快",而是"知道该让 AI 写什么、写完怎么验证、上线后谁来负责"。把编程重新定义为四层:层级内容AI 能否做你的价值L1 实现写函数、调 API、改样式✅ 大部分审查、修改L2 设计架构、模块划分、接口设计🔶 辅助主导L3 定义需求澄清、业务建模、取舍决策❌ 不能核心L4 负责上线、运维、兜底、承担后果❌ 不能不可替代AI 擅长 L1,你要占领 L2/L3/L4。AI 替代的是"代码打字员",不是"软件工程师"。
2026-09-01 15:26:18
353
原创 EF Core 性能调优深度实战:从慢查询到毫秒级响应
写 LINQ 时,脑子里想的是 SQL。N+1 是头号敌人 → Include 或 Select 投影只读场景必加 AsNoTracking → 内存减半、速度翻倍批量操作绕过 ChangeTracker → ExecuteUpdate/Delete 或 Bulk 库Include 过深用 AsSplitQuery → 避免笛卡尔积分页用键集不用 Skip → 索引友好复杂查询直接写 SQL → FromSqlRaw 不丢人EF Core 不是性能瓶颈,
2026-08-31 10:37:10
319
原创 拆解ASP.NET Core 底层源码!从零手写
你有没有过这种感受:用了好几年ASP.NET Core,CRUD 写得飞起,但一碰到底层问题就懵?中间件执行顺序到底是怎么控制的?依赖注入容器内部是怎么创建对象的?路由匹配为什么有时候不按预期工作?为什么同样的代码,换个环境性能差十倍?很多开发者停留在 "会用" 层面,遇到复杂场景就束手无策。真正的差距,不在于你用了多少中间件,而在于你是否理解框架底层的设计思想。
2026-08-27 11:03:55
542
原创 DOTNET 鉴权系列- JWT 会话撤销与主动登出
我第一次知道这个方法,是在极客时间上听一个老师讲的,瞬间豁然开朗,因为颁发和校验token时都是使用秘钥来校验的,换密钥能让所有已签发的 Token 瞬间全部失效,但它属于终极大招,太猛了不分敌我,全部干掉的,实际中应该没人这么做吧,除非密钥泄露,一些重大安全事件、需要全站强制登出才会这么干。如果使用标准流程下实现,哪怕主动退出,强制踢出,或者顶掉了登录,我们再次拿着旧的Token去请求接口,是依然能通过鉴权的,从真实业务和系统安全上来说,我都主动退出了,拿去请求接口怎么还可以,服务端不是应该拒绝的吗?
2026-08-27 09:34:41
124
原创 C# GC 调优实战指南:从原理定位到性能优化
监控指标 → 定位瓶颈 → 代码优化 → 配置调优 → 验证效果↑ │优先级:代码优化 > GC 配置 > 手动干预减少分配比优化回收更有效池化(ArrayPool/ObjectPool)是性价比最高的优化手段不要过早优化,先用数据说话GC 调优不是一次性工作,而是持续观测 → 迭代优化的过程。掌握PerfView三件套,你就能定位 90% 的 GC 问题。如果您觉得我的文章对您有帮助的话,请您打赏一元,我买瓶水喝;您的支持将是我继续分享的无线动力!
2026-08-26 09:09:27
304
原创 一个项目没有源码,如何进行升级改造和维护
仅针对C/C++原生程序,汇编级别修改。工具:IDA Pro、x64dbg、OllyDbg、Cheat Engine;只能做简单修改:弹窗去除、简单逻辑跳转、字符串修改;复杂业务逻辑无法维护,极易引发程序崩溃;只建议应急临时修复,绝不用于正式生产环境长期改造。
2026-08-24 15:28:53
383
原创 C# 中 Task.Run() 完全指南:从原理到避坑实践
Task.Run()是 C# 异步编程中最常用的工具之一,但它不是万能药它解决的是 CPU 密集型工作的线程池调度问题它不解决 I/O 等待问题(那是 async I/O 的事)它在 ASP.NET Core 中的价值被严重高估它在 WPF/WinForms 中是保持 UI 响应的利器如果您觉得我的文章对您有帮助的话,建议您打赏一元,您的支持将是我继续分享的无线动力!
2026-08-22 11:10:35
627
原创 C# 委托(Delegate)完全指南:从基础到实战
委托是一种类型安全的函数指针,它定义了方法的签名(返回值类型 + 参数列表),可以持有符合该签名的一个或多个方法的引用,并在需要时调用它们。// 定义委托// 符合签名的方法// 使用类型安全:编译器检查方法签名是否匹配可以指向静态方法、实例方法、匿名方法、Lambda 表达式支持多播(Multicast),即一个委托变量可以绑定多个方法本质是的子类,继承自委托是 C# 中将方法作为参数传递的核心机制,它让代码从"硬编码调用"进化为"行为注入"。掌握委托,你就掌握了:事件驱动编程。
2026-08-22 09:59:10
111
原创 C# 实战:Clean Architecture + DDD 架构全解析
Clean Architecture 决定“依赖往哪指”,DDD 决定“业务放哪写”。如果您觉得 我的文章对您有帮助的话,建议您打赏一元,我买瓶水喝,您的支持将我继续创作的无线动力!
2026-08-20 16:16:03
369
原创 C#关于同步方法里面调用异步方法的探究
我在写代码的时候(.net core)有时候会碰到void方法里,调用async方法并且Wait,而且我还看到别人这么写了。而且我这么写的时候,编译器没有提示任何警告。但是看了dudu的文章:一码阻塞,万码等待:ASP.NET Core 同步方法调用异步方法“死锁”的真相 了解了,这样写是有问题的。但是为什么会有问题呢?
2026-08-20 15:49:26
143
原创 Controller 加了 [Authorize] 授权该怎么设计
需要提醒的是,灵活性和安全性往往是一对需要权衡的目标:权限越是动态可配置,越需要在缓存策略、变更生效速度、审计日志上多花心思,否则"谁在什么时候被授予了什么权限"这件事本身也会变得难以追溯,反而带来新的风险。
2026-08-19 14:28:45
166
原创 六大原则是必备基本功
一个类、接口或方法有且只有一个引起它变化的原因,只负责一项职责。通俗来讲:不要让一个类 "身兼数职",既管数据存储、又管业务校验、还管日志通知。职责越多,耦合越重,修改一处就可能引发连锁故障。对扩展开放,对修改关闭。新增功能时,应该通过扩展已有代码来实现,而不是修改原有稳定运行的代码。这是架构设计的灵魂,也是应对需求频繁变更的核心手段。子类可以无缝替换父类,程序行为不发生改变、不产生异常、不违背原有逻辑预期。子类可以扩展父类功能,但不能改变父类原有功能。
2026-08-19 11:38:12
235
原创 ASP.NET Core MVC + Redis 实战缓存方案,优化列表查询,开发高并发订单管理系统
只缓存高频、相对不频繁变化的数据,实时性要求极高的场景慎用。
2026-08-19 10:08:37
459
原创 c#WPF开发常见问题
现象:自定义控件时,属性绑定不生效,或者 XAML 报错。原因:依赖属性的包装器(Wrapper)里写了逻辑,或者注册时参数写错。解决方案不要在 CLR Wrapper(get/set)中写逻辑:WPF 在 XAML 解析时有时会绕过 Wrapper 直接调用。使用 标准模板。// ❌ 错误写法:在 Wrapper 中写逻辑set// 警告:XAML 可能不会调用这个 Setter!// 这行代码可能永远不会执行// ✅ 正确写法:使用 PropertyChangedCallback。
2026-08-13 15:48:36
203
1
原创 .NET LINQ 性能优化实战:节省查询
需要多次遍历?.ToList()先物化。一条链只跑一次。升级 .NET 9。数组和 List 上的AnyCountFirst自动走 Span 快速通道,零分配 + 7 倍速。判空用Any(),别用。一个短路,一个全量。.Where()永远写在.Select()前面。先过滤再投影,无效分配大幅减少。热路径上不要迷信 LINQ。Span<T>+ 手动循环可以再榨 20 倍性能。但只在 Benchmark 证明有必要时才这样做。LINQ 不是慢的语言特性,它是表达能力与执行效率之间的一个选择。
2026-08-12 08:57:26
412
原创 c#手写一个简易 DI 容器
Singleton,Transient_logger.Log("订单已创建");手写 DI 容器的本质:用反射 + 递归 + 缓存,把“new 对象”这件事交给框架。
2026-08-08 11:55:52
155
原创 C# 反射(Reflection)详解:从原理到实战
反射是 .NET 提供的一种机制,允许程序在运行时动态地获取类型信息(Type)、访问元数据(Metadata),并动态创建对象、调用方法、读写属性/字段,甚至操作私有成员。反射 = 运行时的类型自省 + 动态操作// 不知道 MyClass 是什么,也能创建对象并调用方法。
2026-08-08 11:52:26
196
2
.net core服务限流样例源码
2026-09-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅