繁体   English   中英

ASP.NET WebApi动作在序列化后配置?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM