You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从中间件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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:33:35