0

0

C# 文件操作的混沌工程 C#如何通过注入延迟或错误来测试文件IO的鲁棒性

幻夢星雲

幻夢星雲

发布时间:2026-03-12 12:45:39

|

828人浏览过

|

来源于php中文网

原创

正确做法是继承 Stream 重写 Read/Write/Flush/Seek 等方法,在底层流层精准控制故障时机,同时必须同步实现对应 Async 方法,避免异步路径绕过注入,且需确保资源彻底释放、不污染环境。

c# 文件操作的混沌工程 c#如何通过注入延迟或错误来测试文件io的鲁棒性

FileStream 包裹模拟故障的底层流

直接在真实文件上反复注入错误既慢又污染环境,更关键的是无法精准控制失败时机。正确做法是写一个可控制的 Stream 子类,在读/写/Flush等关键点按需抛异常或延迟。

常见错误现象:IOExceptionTimeoutException 或线程卡死,但堆栈指向 FileStream.Read 等原生调用,根本看不出是测试逻辑导致的——说明你没拦截在流层,而是去 patch 了更高层(比如 File.ReadAllText),这会漏掉很多底层路径。

  • 必须继承 Stream,重写 ReadWriteFlushSeek(如果测试涉及随机访问)
  • 不要在构造时打开真实文件,而是在 Read/Write 中才委托给一个真实的 FileStream 实例
  • Random + 条件判断决定是否延迟(Task.Delay 后同步等待)或抛 IOException(别抛 InvalidOperationException,那不是 IO 层该冒的错)

AppDomain 或进程级文件锁干扰测试

本地跑单测时,常出现“文件正由另一进程使用”这种错误,其实只是前一次测试没 properly dispose 掉 FileStream,残留句柄锁住了文件。这不是混沌设计问题,是清理漏洞。

使用场景:连续跑多组故障注入测试(比如先测超时,再测磁盘满),必须确保每次测试后资源彻底释放。

  • 所有 FileStream 必须用 using 或显式 Dispose(),不能只靠 Close()
  • 避免在测试中用 File.OpenRead(path) 这类工厂方法——它返回的流不保证可重复 Dispose,且类型不可控;改用 new FileStream(path, ...) 显式构造
  • Windows 下可用 handle.exe(Sysinternals)查残留句柄,Linux/macOS 用 lsof -p [pid] 验证

异步 IO 路径绕过同步故障注入

如果你只重写了 Stream.Read,但代码实际走的是 Stream.ReadAsync,那所有延迟和异常都不会触发——这是最常被忽略的断裂点。

人民网AIGC-X
人民网AIGC-X

国内科研机构联合推出的AI生成内容检测工具

下载

性能影响:ReadAsync 默认可能回退到线程池同步读(尤其小缓冲区),导致你以为在测异步,实则没压出真正的并发压力。

  • 必须同时重写 ReadAsyncWriteAsyncFlushAsync,且行为要和同步版本一致(比如同样概率抛异常)
  • 检查目标代码是否用了 ConfigureAwait(false),否则测试线程可能被 await 拖入 UI 上下文,掩盖线程阻塞问题
  • 别依赖 Task.Run(() => base.Read(...)) 模拟异步——这会掩盖真实 I/O 完成端口(IOCP)行为,测了也白测

路径权限与 UNC 映射在 CI 中失效

本地用管理员权限能成功注入“拒绝访问”错误,但 CI 机器(如 Azure Pipelines 的 windows-2022)默认没有管理员 token,File.SetAccessControl 直接抛 UnauthorizedAccessException,导致故障分支根本跑不起来。

兼容性影响:不同 Windows 版本对 SeSecurityPrivilege 的要求不同,Server 2019 比 Win10 更严格。

  • 放弃在 CI 中动态改 ACL,改用流层抛 UnauthorizedAccessException(它和系统抛的一样,上层 catch 逻辑无需改动)
  • UNC 路径(\servershare)在容器化 CI 中通常不可达,别在测试里硬编码;统一用 Path.GetTempPath() + 随机子目录
  • 若必须验证权限逻辑,用 new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None, 4096, FileOptions.DeleteOnClose) 配合已知只读文件,比改 ACL 更可靠

真正难的不是让文件读失败,而是让失败发生在调用栈里那个具体位置——比如刚读完 header 就断,而不是一上来就炸。这意味着你要在流内部维护状态机,而不是简单掷骰子。这点多数人试两次就放弃了,然后退回到 mock 高层 API,结果漏掉 FileStream 缓冲、OS 缓存、NTFS 日志这些真家伙。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6608

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

842

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1092

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

2175

2024.03.01

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.1万人学习

C 教程
C 教程

共75课时 | 5.4万人学习

C++教程
C++教程

共115课时 | 21.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号