如何从中间件StreamReader响应体统计特定属性的结果数量
修正日志中间件结果数量统计错误的方案
问题根源
现有代码错误统计了DTOResultObject自身的属性数量(如Id、LogId等),而非其Result属性内的实际业务数据数量。
修正思路
核心逻辑是跳过DTOResultObject本身的属性,直接针对Result属性的内容做计数,需根据Result的类型分情况处理:
- 若
Result是集合类型(如List<T>、数组、IEnumerable<T>):统计集合元素数量 - 若
Result是单个实体/值类型(如用户对象、字符串、数值):按1条统计(特殊类型可按需调整) - 若
Result为null:计数为0
具体代码实现
1. 明确DTOResultObject结构(参考)
public class DTOResultObject { public int Id { get; set; } public string LogId { get; set; } // 其他业务无关属性 public object Result { get; set; } // 存储实际返回的业务数据 }
2. 中间件中的修正逻辑
// 假设已从响应中获取到DTOResultObject实例(需确保中间件能正确捕获该对象) var dtoResult = context.Response.HttpContext.Items["DTOResult"] as DTOResultObject; if (dtoResult == null) return; int resultCount = 0; var resultData = dtoResult.Result; if (resultData != null) { // 处理集合类型(排除string,因为string本身是IEnumerable<char>) if (resultData is IEnumerable enumerable && !(resultData is string)) { resultCount = enumerable.Cast<object>().Count(); } else { // 单个数据对象,计数为1 resultCount = 1; } } // 将统计得到的resultCount存入日志表 // 示例:_logDbContext.Logs.Add(new LogEntry { ResultCount = resultCount, ... }); // await _logDbContext.SaveChangesAsync();
3. 泛型DTOResultObject的适配(若使用泛型定义)
如果你的DTOResultObject是泛型类,处理逻辑类似,只是类型更明确:
public class DTOResultObject<T> { public int Id { get; set; } public string LogId { get; set; } public T Result { get; set; } } // 中间件中的处理 var dtoResult = context.Response.HttpContext.Items["DTOResult"] as DTOResultObject<object>; // 后续计数逻辑同上述非泛型版本
注意事项
- 确保中间件能正确捕获控制器返回的
DTOResultObject:可通过ActionFilter将返回对象存入HttpContext.Items,或在中间件中读取响应内容并反序列化为DTOResultObject(反序列化需注意性能损耗) - 特殊类型自定义处理:如果
Result是字符串,可根据业务需求选择按1条统计或按字符数统计 - 空值防护:必须处理
Result为null的情况,避免空引用异常
内容的提问来源于stack exchange,提问作者PEDRAM POURHAKIM
相关产品推荐
相关产品推荐

