我正在使用 Amazon SDK,我有一个方法可以为存储在 Amazon S3 服务中的对象返回 Stream。
它包含这样的内容:
var request = new GetObjectRequest().WithBucketName(bucketName).WithKey(keyName);
using (var response = client.GetObject(request))
{
return response.ResponseStream;
}
显然,执行此操作时,无法从调用方法读取流,因为请求对象已被释放,完成后,它会关闭流。
我不想将文件下载到 MemoryStream 或 FileStream。
如果我不使用 using 子句,垃圾收集器会在某个时候处理请求对象,所以我不能不使用它。
我想问的是,有没有一种方法可以将 Stream 包装或复制到另一个 Stream 中,然后在不下载文件的情况下将其返回?
我正在使用 .NET 3.5。
编辑:该方法继承自抽象类,调用方方法不知道它正在与 Amazon 一起工作。所以它必须返回一个流。
最佳答案
处理流后,您将无法使用该流,但您可以推迟处理响应对象,直到响应流被使用之后。我可以建议三个选项。
返回响应。一种选择是将响应对象返回给调用者。调用者可以访问包含的响应流,然后在完成后处理响应。这是最简单的更改,但也需要调用者进行更改。
包装流。不是直接返回响应流,而是创建一个新对象来扩展 Stream 并包装响应流,但也有对响应本身的引用。然后当你的包装器被释放时,你可以在内部释放响应对象。只要返回的类型只是
Stream
,这只需要更改您的调用代码。 .回调。不要从该方法返回任何内容,而是使用回调机制。接受
Action<Stream>
作为参数并使用流调用此回调。这样调用者代码被调用,你仍然可以控制响应和流的处理。这是最安全的机制,因为您不依赖调用者来处置任何东西,但需要最多的更改。
关于c# - 在处理响应后使用 Amazon S3 响应流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6213834/