如何包装响应 - 响应返回null

时间:2017-02-09 21:40:30

标签: c# amazon-web-services amazon-s3

使用下面的代码片段,我从AWS S3存储桶中获取一个对象 现在,我想在其他方法中动态修改对象,因此我需要能够返回下面方法的响应。

但是,由于我有一个using子句,GetResponseObject被释放,基本上返回null

我在Work with an Amazon S3 response stream after response has been disposed读到我应该返回回复。但是,如果我返回响应,它将在调用方法中返回null

也许你可以用一些代码片段解释三个mentioned步骤?这将非常有帮助。

  1. 退货回复
  2. 包裹流
  3. 回调
  4. 此时我并不清楚为什么我的返回response的方法如下所示导致responsenull

    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;
                    }
        }
    }
    

2 个答案:

答案 0 :(得分:1)

如果您添加了Console.WriteLine的结果,那将会很有帮助。我假设你在第一行看到了client.GetObject(request)的结果。

问题是你正在阅读流:reader.ReadToEnd()。这将在流的末尾设置流的位置。

如果要返回响应,则流中不再有字节,因此返回null。

如果删除Console.WriteLine,您应该得到非空的响应。

答案 1 :(得分:1)

当你调用return response;时,在控制可以传递给调用函数之前发生的事情之一是必须完成所有using块。在您的情况下,这意味着readerresponseStreamresponseclient都已被处理掉。即使你确实得到了一个返回的变量,它也没用,因为你不能对被处置的对象执行任何操作。

要解决此问题,只需移动

即可
using (GetObjectResponse response = client.GetObject(request))

GetObjectResponse response = client.GetObject(request);

此外,我非常假设从S3返回的流是一个不可搜索的流,这意味着一旦你在其上调用了ReadToEnd(),你就无法通过用它来做很多事。