ASP.NET WebApi动作在序列化后处理?

时间:2014-09-01 01:55:11

标签: c# asp.net asp.net-web-api asp.net-web-api2

我有一个返回可枚举的WebApi控制器操作。我有一个MediaTypeFormatter连接,了解如何序列化这个可枚举。问题是可枚举是(按设计)懒惰评估。除了必须在使用后可以丢弃可枚举之外,这样就可以了。不幸的是,由于懒惰的评价,如果我做这样的事情:

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

然后在序列化程序获取它之前处理disposableEnumerable。这导致序列化失败,因为源已被处理。

另一方面,如果我不将它包装在如下的使用语句中:

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

然后它永远不会丢弃,我泄漏了物体。

在序列化之后,确保我的一次性用品的最佳方式是什么?

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

1 个答案:

答案 0 :(得分:3)

实现这一目标的一些选择:

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

  • ApiControllers是一次性的,所以你也可以把你的可枚举物丢弃。这有效,因为webapi总是确保在写出响应后处理它。事实上,控制器实例的注册就像上面提到的那样。