gpt4 book ai didi

c# - ASP.NET WebApi 操作在序列化后处理?

转载 作者:行者123 更新时间:2023-11-30 22:03:58 25 4
gpt4 key购买 nike

我有一个返回可枚举的 WebApi Controller 操作。我连接了一个 MediaTypeFormatter,它了解如何序列化这个可枚举对象。问题是枚举是(按设计)延迟评估的。这会很好,除了枚举必须在使用完毕后进行处理。不幸的是,由于懒惰的评估,如果我这样做:

public IEnumerable<MyClass> Get()
{
using (var disposableEnumerable = GetData())
{
return disposableEnumerable;
}
}

然后 disposableEnumerable 在序列化器获取它之前被释放。这会导致序列化失败,因为源已被处置。

另一方面,如果我不将它包装在像这样的 using 语句中:

public IEnumerable<MyClass> Get()
{
return GetData();
}

然后它永远不会被处置,我泄漏了对象。

什么是确保我的一次性用品在序列化后得到处理的最佳方法?

注意:在可枚举对象上调用 ToList 不是一个选项。我返回可枚举而不是具体列表的原因是出于内存原因。可枚举很大,枚举过程中创建的对象也很大。

最佳答案

实现此目的的一些选项:

  • 在您的操作中执行 Request.RegisterForDispose(disposableEnumerable);。这将导致可枚举对象在您的回复写出后被释放。请注意,RegisterForDispose 扩展是 System.Net.Http 命名空间的一部分。

  • ApiController 是一次性的,因此您也可以在那里处理您的枚举。这是因为 webapi 始终确保在写出响应后对其进行处理。其实就是注册了一个controller实例,就像上面提到的一点。

关于c# - ASP.NET WebApi 操作在序列化后处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25597956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com