应按百分比与绝对值双校验磁盘剩余空间:先用driveinfo获取本地卷freespace,再判断是否同时满足最小百分比(如15%)和最小绝对值(如20gb),网络驱动器需try/catch捕获ioexception。

如何用 DriveInfo 检查磁盘剩余空间是否低于阈值
健康端点里最常被忽略的是「阈值合理性」——比如硬写 10GB,但生产环境可能跑在 500GB 或 2TB 的盘上,10GB 实际已属危险。正确做法是按百分比 + 绝对值双校验。
-
DriveInfo只能查本地挂载卷,网络驱动器(如Z:\映射的 SMB)会抛IOException,必须try/catch - 推荐逻辑:
freeSpace ,两者任一成立即告警 - 注意
AvailableFreeSpace和TotalFreeSpace区别:前者扣除了系统保留空间(如 Windows 的 4GB),健康检查该用前者
文件可访问性检查为什么不能只靠 File.Exists()
File.Exists() 返回 true 不代表你能读——权限不足、文件被独占锁住、NTFS 加密或符号链接断裂都会导致后续 File.OpenRead() 失败。健康端点要模拟真实使用路径。
- 必须组合检查:
File.Exists(path)→File.GetAttributes(path)确认非ReadOnly且非Hidden→ 最后using var _ = File.OpenRead(path)真实尝试打开 - 超时控制很关键:避免因 NFS 挂起或远程文件锁导致整个健康检查阻塞,建议用
CancellationTokenSource.CreateLinkedTokenSource(...).Token设 3 秒超时 - 路径中含空格或 Unicode 字符时,
File.Exists()在 .NET 5+ 默认支持,但旧版需确保AppContext.SetSwitch("System.IO.UseLegacyPathHandling", false)
IWebHostEnvironment 下如何安全获取应用配置路径并检查
硬编码路径(如 "./logs/app.log")在容器或 IIS 部署时大概率失败——工作目录不等于应用根目录。必须通过注入的环境对象定位。
- 从
IWebHostEnvironment取WebRootPath或ContentRootPath,再拼接目标文件,例如:Path.Combine(env.ContentRootPath, "appsettings.json") - 检查前先确认目录存在:
Directory.Exists(Path.GetDirectoryName(filePath)),否则File.Exists()直接返回false,掩盖了父目录缺失的问题 - Linux 容器中要注意大小写敏感:
"AppSettings.json"和"appsettings.json"是不同文件,开发机 Windows 不报错,上线就跪
健康端点响应体里要不要暴露具体错误细节
暴露 "Access to path 'X:\config' is denied" 这类信息属于信息泄露,尤其当端点未加鉴权时。但完全隐藏又不利于运维定位。
- 生产环境响应体只返回结构化状态码和模糊原因,例如:
{"disk": "warn", "file": "error", "message": "Critical dependency unavailable"} - 详细错误日志必须写入
ILogger,且包含Activity.Current?.Id方便链路追踪 - 如果端点加了 Basic Auth 或 JWT,可对认证用户返回带
debug: true的详情字段,但绝不走默认路径
真正难处理的是并发场景:多个请求同时触发健康检查,而磁盘 I/O 或文件锁本身就会成为瓶颈。别在 GET /health 里做重操作,要么预热缓存,要么异步采样——否则健康检查自己就成了故障源。










