2017-02-09 2 views
0

Используя нижеприведенный фрагмент кода, я возвращаю объект из своего ковша AWS S3.
Теперь я хотел бы изменить объект «на лету» в рамках какого-то другого метода, поэтому мне нужно будет вернуть ответ метода ниже.Как обернуть ответ - Ответ возвращается null

Однако, поскольку у меня есть пункт использования, то устанавливается GetResponseObject, который по существу возвращает null.

Я прочитал в Work with an Amazon S3 response stream after response has been disposed, что я должен вернуть ответ. Однако, если я верну ответ, он возвращает null в вызывающем методе.

Возможно, вы могли бы объяснить три этапа mentioned с помощью некоторых фрагментов кода? Это было бы очень полезно.

  1. Вернуться Response
  2. Оберните поток
  3. Ответный

На данный момент я не тихо понимаю, почему мой подход возвращения 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; 
       } 
    } 
} 
+1

Почему бы просто не переместить 'response' из блоков' using'? Объявите его перед другим 2 'using', а затем верните его. – Tim

ответ

1

Когда вы вызываете return response;, одна из вещей, которая возникает до того, как управление может перейти к вызывающей функции, - это все using блоки должны быть закончены. В вашем случае это означает, что все reader, responseStream, response и client. Даже если вы получили возвращаемую переменную, это было бы бесполезно, так как вы не можете выполнять какие-либо операции над расположенным объектом.

Чтобы это исправить, просто переместите

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

в

GetObjectResponse response = client.GetObject(request); 

Кроме того, я бы очень предположить, возвращаемый поток от S3, чтобы быть не доступной для поиска потока, то есть, как только вы» ve называется ReadToEnd() на нем, вы не сможете много сделать с ним.

1

Было бы полезно, если бы вы добавили результат Console.WriteLine. Я предполагаю, что вы видите результат client.GetObject (запрос) в первой строке.

Проблема в том, что вы читаете поток: reader.ReadToEnd(). Это установит положение потока в конце потока.

Когда вы хотите вернуть ответ, в потоке больше нет байтов, и поэтому возвращается null.

Если вы удалите Console.WriteLine, вы должны получить ответ, который не является нулевым.

Смежные вопросы