当我捕获子属性时,父对象超出范围 - 何时处置子属性?

时间:2014-06-18 05:36:16

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

我不太确定如何说出问题,但要详细说明,我在ASP.Net Web API 2项目中使用AWS SDK,我想返回S3对象的响应流 - 流交付给客户然后处置。

我不确定的是,我对S3的引用被抽象为IFileStore对象,以便将自己与AWS分离为依赖关系。在我的文件存储库中,我检索包含S3Response属性的ResponseStream对象。如果处置S3Response对象,它将处置基础ResponseStreamIFileStore只返回Stream,然后我将其打包并从我的API返回StreamContent

鉴于我呼叫FileStore.GetFile(...)并且它返回ResponseStream属性的值而ResponseStream然后超出范围,我怀疑Dispose可能会在HTTP响应完成之前,在正常的GC行为期间由父节点在ResponseStream对象上调用。

如何将S3抽象化并确保响应流仅在HTTP响应完成后处理?

我可以做的一种方法是将整个S3响应对象打包到一个通用容器对象中,该对象实现Stream作为底层流的代理,以便我可以从我的StreamContent返回API方法,然后让Dispose方法在框架自然地在进程结束时调用Dispose时处理整个底层S3响应对象。不确定是否有更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:2)

使用PushStreamContent从ASP.NET Web API向客户端传输数据可能是个好主意。 PushStreamContent支持异步数据生成lambda(Func<Task>),客户端可以立即开始接收内容流。

这是关于此主题的精彩博文,其中包含一些示例代码:"Asynchronous Streaming in ASP.NET WebApi"

我无法代表AWS SDK发言,但理想情况下,您可以将AWS API返回的数据流异步抽取到发送到Web API客户端的流中。