c# - 在处理响应后使用 Amazon S3 响应流

标签 c# asp.net stream amazon-s3

我正在使用 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 一起工作。所以它必须返回一个流。

最佳答案

处理流后,您将无法使用该流,但您可以推迟处理响应对象,直到响应流被使用之后。我可以建议三个选项。

  1. 返回响应。一种选择是将响应对象返回给调用者。调用者可以访问包含的响应流,然后在完成后处理响应。这是最简单的更改,但也需要调用者进行更改。

  2. 包装流。不是直接返回响应流,而是创建一个新对象来扩展 Stream 并包装响应流,但也有对响应本身的引用。然后当你的包装器被释放时,你可以在内部释放响应对象。只要返回的类型只是 Stream,这只需要更改您的调用代码。 .

  3. 回调。不要从该方法返回任何内容,而是使用回调机制。接受 Action<Stream>作为参数并使用流调用此回调。这样调用者代码被调用,你仍然可以控制响应和流的处理。这是最安全的机制,因为您不依赖调用者来处置任何东西,但需要最多的更改。

关于c# - 在处理响应后使用 Amazon S3 响应流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6213834/

相关文章:

c# - C#用两个随机数求和,但必须等于用户输入

c# - Google API Where() 和 When() 命名空间

C# 从不同的表单类调用方法?

asp.net - 为什么需要执行服务器端验证?

c# - AjaxControlToolkit ReorderList 不起作用

node.js - 可读流和回调函数

c# - 从应用程序中观察堆栈上的值类型和堆上的对象

java - 在System.java源码中,标准输入、输出和错误流都被声明为final并初始化为null?

timer - dart:在给定时间后停止收听流

asp.net - 如何在设计时获取复合控件的子控件