使用下面的代码片段,我从AWS S3存储桶中获取一个对象 现在,我想在其他方法中动态修改对象,因此我需要能够返回下面方法的响应。
但是,由于我有一个using子句,GetResponseObject
被释放,基本上返回null
。
我在Work with an Amazon S3 response stream after response has been disposed读到我应该返回回复。但是,如果我返回响应,它将在调用方法中返回null
。
也许你可以用一些代码片段解释三个mentioned步骤?这将非常有帮助。
此时我并不清楚为什么我的返回response
的方法如下所示导致response
为null
。
public GetObjectResponse GetFile(string keyName)
{
using (client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1))
{
GetObjectRequest request = new GetObjectRequest
{
BucketName = bucketName,
Key = keyName
};
using (GetObjectResponse response = client.GetObject(request))
using (Stream responseStream = response.ResponseStream)
using (StreamReader reader = new StreamReader(responseStream))
{
Console.WriteLine("Reader: " + reader.ReadToEnd());
Console.WriteLine("Stream: " + responseStream);
return response;
}
}
}
答案 0 :(得分:1)
如果您添加了Console.WriteLine的结果,那将会很有帮助。我假设你在第一行看到了client.GetObject(request)的结果。
问题是你正在阅读流:reader.ReadToEnd()。这将在流的末尾设置流的位置。
如果要返回响应,则流中不再有字节,因此返回null。
如果删除Console.WriteLine,您应该得到非空的响应。
答案 1 :(得分:1)
当你调用return response;
时,在控制可以传递给调用函数之前发生的事情之一是必须完成所有using
块。在您的情况下,这意味着reader
,responseStream
,response
和client
都已被处理掉。即使你确实得到了一个返回的变量,它也没用,因为你不能对被处置的对象执行任何操作。
要解决此问题,只需移动
即可using (GetObjectResponse response = client.GetObject(request))
到
GetObjectResponse response = client.GetObject(request);
此外,我非常假设从S3返回的流是一个不可搜索的流,这意味着一旦你在其上调用了ReadToEnd()
,你就无法通过用它来做很多事。