我不太确定如何说出问题,但要详细说明,我在ASP.Net Web API 2项目中使用AWS SDK,我想返回S3对象的响应流 - 流交付给客户然后处置。
我不确定的是,我对S3的引用被抽象为IFileStore
对象,以便将自己与AWS分离为依赖关系。在我的文件存储库中,我检索包含S3Response
属性的ResponseStream
对象。如果处置S3Response
对象,它将处置基础ResponseStream
。 IFileStore
只返回Stream
,然后我将其打包并从我的API返回StreamContent
。
鉴于我呼叫FileStore.GetFile(...)
并且它返回ResponseStream
属性的值而ResponseStream
然后超出范围,我怀疑Dispose
可能会在HTTP响应完成之前,在正常的GC行为期间由父节点在ResponseStream
对象上调用。
如何将S3抽象化并确保响应流仅在HTTP响应完成后处理?
我可以做的一种方法是将整个S3响应对象打包到一个通用容器对象中,该对象实现Stream
作为底层流的代理,以便我可以从我的StreamContent
返回API方法,然后让Dispose
方法在框架自然地在进程结束时调用Dispose时处理整个底层S3响应对象。不确定是否有更好的方法来做到这一点。
答案 0 :(得分:2)
使用PushStreamContent
从ASP.NET Web API向客户端传输数据可能是个好主意。 PushStreamContent
支持异步数据生成lambda(Func<Task>
),客户端可以立即开始接收内容流。
这是关于此主题的精彩博文,其中包含一些示例代码:"Asynchronous Streaming in ASP.NET WebApi"。
我无法代表AWS SDK发言,但理想情况下,您可以将AWS API返回的数据流异步抽取到发送到Web API客户端的流中。