230 lines
4.8 KiB
Markdown
230 lines
4.8 KiB
Markdown
# 🚀 优化快速参考卡
|
||
|
||
## 核心改进速览
|
||
|
||
### ⚡ 性能优化
|
||
```csharp
|
||
// ❌ 之前:阻塞调用
|
||
SaveOriginalInspectionStoreResult(form);
|
||
|
||
// ✅ 现在:完全异步
|
||
await SaveOriginalInspectionStoreResultAsync(form).ConfigureAwait(false);
|
||
```
|
||
|
||
**结果**: 并发能力提升 3-4 倍
|
||
|
||
---
|
||
|
||
### 🔒 安全加固
|
||
```csharp
|
||
// 文件大小限制:50MB
|
||
private const int MaxFileSize = 50 * 1024 * 1024;
|
||
|
||
// 文件类型白名单
|
||
private static readonly string[] AllowedFileExtensions =
|
||
{ ".jpg", ".jpeg", ".png", ".bmp", ".gif" };
|
||
```
|
||
|
||
**保护**: DoS 攻击、恶意文件上传、路径遍历
|
||
|
||
---
|
||
|
||
### ✅ 输入验证
|
||
```csharp
|
||
// 请求验证
|
||
if (request == null) return error;
|
||
|
||
// 内容类型验证
|
||
if (!request.ContentType.Contains("multipart/form-data")) return error;
|
||
|
||
// 数据验证
|
||
if (form == null || form.Count == 0) return error;
|
||
```
|
||
|
||
**收益**: 早期失败,清晰错误消息
|
||
|
||
---
|
||
|
||
### 📊 错误处理
|
||
```csharp
|
||
catch (MongoException ex) // 数据库错误
|
||
catch (IOException ex) // 文件系统错误
|
||
catch (ArgumentException ex) // 参数错误
|
||
catch (Exception ex) // 未预期错误
|
||
```
|
||
|
||
**每个异常都有**:
|
||
- 用户友好的消息
|
||
- 详细的日志记录
|
||
- 适当的错误码
|
||
|
||
---
|
||
|
||
### 🔄 并行处理
|
||
```csharp
|
||
// ❌ 之前:串行加载 (~200ms)
|
||
var presets = _presetPointRepository.GetAll().ToList();
|
||
var videos = _videoDevRepository.GetAll().ToList();
|
||
|
||
// ✅ 现在:并行加载 (~100ms)
|
||
await Task.WhenAll(presetsTask, videosTask);
|
||
```
|
||
|
||
**提升**: 50% 时间节省
|
||
|
||
---
|
||
|
||
### 🛡️ 弹性设计
|
||
```csharp
|
||
foreach (var item in items)
|
||
{
|
||
try {
|
||
await ProcessItem(item);
|
||
}
|
||
catch (Exception ex) {
|
||
Log4Helper.Error(...);
|
||
// 继续处理其他项目
|
||
}
|
||
}
|
||
```
|
||
|
||
**特性**: 部分成功 - 单个失败不影响整体
|
||
|
||
---
|
||
|
||
## 📋 方法结构
|
||
|
||
### 重构后的方法层次
|
||
```
|
||
UploadInspectionTaskResult() // 🎯 主方法:验证和编排
|
||
├── SaveOriginalInspectionStoreResultAsync() // 📦 数据加载和迭代
|
||
├── BuildInspectionStoreResultAsync() // 🏗️ 对象构建
|
||
│ └── ProcessInspectionFilesAsync() // 📁 文件处理
|
||
└── EnrichItemWithCameraInfo() // 💎 数据丰富化
|
||
```
|
||
|
||
---
|
||
|
||
## 🎯 关键常量
|
||
|
||
| 常量 | 值 | 用途 |
|
||
|------|-----|------|
|
||
| `MaxFileSize` | 50MB | 单文件最大大小 |
|
||
| `MaxFilesPerItem` | 100 | 每项最大文件数 |
|
||
| `AllowedFileExtensions` | .jpg, .jpeg, .png, .bmp, .gif | 允许的文件类型 |
|
||
|
||
---
|
||
|
||
## 📝 日志级别使用
|
||
|
||
| 级别 | 使用场景 | 示例 |
|
||
|------|----------|------|
|
||
| `Info` | 正常操作流程 | "Processing inspection result upload" |
|
||
| `Warn` | 非致命问题 | "File exceeds maximum size, skipping" |
|
||
| `Error` | 错误和异常 | "MongoDB error - {ex.Message}" |
|
||
|
||
---
|
||
|
||
## ✨ 最佳实践应用
|
||
|
||
### 1. 异步模式
|
||
```csharp
|
||
✅ await xxx.ConfigureAwait(false) // 避免上下文捕获
|
||
✅ await using (var fs = ...) // 异步资源释放
|
||
✅ await file.CopyToAsync(fs) // 异步 I/O
|
||
```
|
||
|
||
### 2. 验证模式
|
||
```csharp
|
||
✅ 提前验证(Guard Clauses)
|
||
✅ 清晰的错误消息
|
||
✅ 记录验证失败
|
||
```
|
||
|
||
### 3. 错误处理模式
|
||
```csharp
|
||
✅ 特定异常类型优先
|
||
✅ 记录完整上下文
|
||
✅ 返回用户友好消息
|
||
✅ 继续处理(不要因一个失败而全部失败)
|
||
```
|
||
|
||
### 4. 安全模式
|
||
```csharp
|
||
✅ 白名单验证(不是黑名单)
|
||
✅ 大小限制
|
||
✅ 类型验证
|
||
✅ 路径清理
|
||
```
|
||
|
||
---
|
||
|
||
## 🔍 测试建议
|
||
|
||
### 单元测试重点
|
||
- [ ] 空引用验证
|
||
- [ ] 无效内容类型
|
||
- [ ] 文件大小超限
|
||
- [ ] 文件类型验证
|
||
- [ ] 部分成功场景
|
||
|
||
### 集成测试重点
|
||
- [ ] 完整上传流程
|
||
- [ ] 数据库故障恢复
|
||
- [ ] 文件系统错误处理
|
||
- [ ] 并发请求处理
|
||
|
||
### 性能测试重点
|
||
- [ ] 并发请求(100+ 同时)
|
||
- [ ] 大文件上传(接近 50MB)
|
||
- [ ] 多文件批量上传
|
||
- [ ] 内存泄漏检测
|
||
|
||
---
|
||
|
||
## 📊 监控指标
|
||
|
||
### 关键指标
|
||
| 指标 | 目标 | 警报阈值 |
|
||
|------|------|----------|
|
||
| 平均响应时间 | < 500ms | > 1000ms |
|
||
| 错误率 | < 1% | > 5% |
|
||
| 文件保存成功率 | > 99% | < 95% |
|
||
| CPU 使用率 | < 50% | > 80% |
|
||
| 内存使用 | < 2GB | > 4GB |
|
||
|
||
---
|
||
|
||
## 🚨 常见问题排查
|
||
|
||
### 问题:请求超时
|
||
**检查**:
|
||
1. 文件大小是否过大
|
||
2. 数据库连接是否正常
|
||
3. 磁盘空间是否充足
|
||
|
||
### 问题:文件保存失败
|
||
**检查**:
|
||
1. 文件类型是否在白名单中
|
||
2. 存储路径权限是否正确
|
||
3. 磁盘空间是否足够
|
||
|
||
### 问题:部分数据丢失
|
||
**检查**:
|
||
1. 查看日志中的错误
|
||
2. 验证数据格式是否正确
|
||
3. 检查数据库连接稳定性
|
||
|
||
---
|
||
|
||
## 📞 快速联系
|
||
|
||
**问题报告**: [开发团队邮箱]
|
||
**文档链接**:
|
||
- [完整优化指南](./OPTIMIZATION_GUIDE.md)
|
||
- [中文总结](./OPTIMIZATION_SUMMARY_CN.md)
|
||
|
||
**最后更新**: 2025-12-15
|
||
|
||
|