2017-02-09 40 views
0

使用下面的代碼片段,我從AWS S3存儲桶中獲取對象。
現在,我想在一些其他方法中動態修改對象,因此我需要能夠返回下面方法的響應。如何包裝響應 - 響應返回null

但是,由於我有一個使用條款,所以GetResponseObject得到處置,基本上返回null

我在Work with an Amazon S3 response stream after response has been disposed中讀到我應該返回響應。但是,如果我返回響應,它將在調用方法中返回null

也許你可以用一些代碼片段來解釋三個mentioned步驟?這將是非常有益的。

  1. 返回響應
  2. 包裹流
  3. 回調

在這一點上我不安靜明白爲什麼我在responsenull圖所示的結果返回response的方法。

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

爲什麼不簡單地將'response'移出'using'塊呢?在其他2'使用'之前聲明它,然後返回它。 – Tim

回答

1

當你調用return response;時,控制之前發生的事情之一可以傳遞給調用函數,所有using塊必須完成。在你的情況下,這意味着reader,responseStream,responseclient都被丟棄。即使你得到一個返回的變量,它也沒用,因爲你不能對一個已處理的對象執行任何操作。

爲了解決這個問題,只需移動

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

GetObjectResponse response = client.GetObject(request); 

此外,我會很假設從S3返回流是非可查找流,一旦你的意思是」已經叫它ReadToEnd()了,你不會用它做很多事情。

1

如果添加了Console.WriteLine的結果會很有幫助。我假設你在第一行看到client.GetObject(request)的結果。

問題是您正在閱讀流:reader.ReadToEnd()。這將在流結束時設置流的位置。

當您想要返回響應時,流中不再有字節,因此返回null。

如果您刪除了Console.WriteLine,您應該得到一個不爲空的響應。