[英]ASP.NET WebApi action dispose after serialization?
我有一个WebApi控制器操作,该操作返回一个可枚举的值。 我有一个MediaTypeFormatter,它了解如何序列化此枚举。 问题是(根据设计)对可枚举进行了延迟评估。 可以,但必须在使用完可枚举后将其丢弃。 不幸的是,由于懒惰的评估,如果我做这样的事情:
public IEnumerable<MyClass> Get()
{
using (var disposableEnumerable = GetData())
{
return disposableEnumerable;
}
}
然后在序列化器获得它之前,就将disabledEnumerable丢弃。 这导致序列化失败,因为已处理源。
另一方面,如果我不将其包装在using语句中,例如:
public IEnumerable<MyClass> Get()
{
return GetData();
}
然后它永远不会被丢弃,而我会泄漏物体。
确保我的一次性用品在序列化后得到处置的最佳方法是什么?
注意:不能在枚举上调用ToList。 我返回可枚举而不是具体列表的原因是出于内存原因。 可枚举很大,并且在枚举过程中创建的对象也很大。
一些实现此目的的选项:
做Request.RegisterForDispose(disposableEnumerable);
在你的行动中。 这将导致在写出您的答复后将所有枚举丢弃。 请注意, RegisterForDispose
扩展名是System.Net.Http
命名空间的一部分。
ApiControllers是一次性的,因此您也可以在其中处理可枚举的对象。 这是因为webapi始终确保在写出响应后立即将其处置。 实际上,就像上述要点一样,注册了一个控制器实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.