Возвращение BLOB-объекта Azure из службы WCF в виде потока. Нужно ли его закрывать? - PullRequest
0 голосов
/ 22 сентября 2011

У меня есть простая служба WCF, которая предоставляет конечную точку REST и извлекает файлы из BLOB-контейнера. Служба возвращает файл в виде потока. я наткнулся на этот пост о закрытии потока после того, как ответ был сделан:

http://devdump.wordpress.com/2008/12/07/disposing-return-values/

Это мой код:

public class FileService
{
     [OperationContract]
     [WebGet(UriTemplate = "{*url}")]
     public Stream ServeHttpRequest(string url)
     {                                
         var fileDir = Path.GetDirectoryName(url);
         var fileName = Path.GetFileName(url);
         var blobName = Path.Combine(fileDir, fileName);
         return getBlob(blobName);                                                                        
     }

     private Stream getBlob(string blobName)
     {
         var account = CloudStorageAccount.FromConfigurationSetting("ConnectingString");
         var client = account.CreateCloudBlobClient();
         var container = client.GetContainerReference("data");
         var blob = container.GetBlobReference(blobName);

         MemoryStream ms = new MemoryStream();           
         blob.DownloadToStream(ms);
         ms.Seek(0, SeekOrigin.Begin);                                   
         return ms;
      }
}

Итак, у меня два вопроса:

  1. Должен ли я следовать шаблону, упомянутому в посте?
  2. Если я изменю свой тип возвращаемого значения на Байт [], каковы минусы / плюсы?

(Мой клиент Silverlight 4.0, на всякий случай, если он имеет какой-либо эффект)

Ответы [ 2 ]

0 голосов
/ 22 сентября 2011

OperationBehaviorAttribute.AutoDisposeParameters по умолчанию имеет значение TRUE, которое вызывает распоряжение на всех входах / выходах, которые доступны. Так что все просто работает.
Эта ссылка:
http://devdump.wordpress.com/2008/12/07/disposing-return-values/
объясняет, как вручную управлять процессом.

0 голосов
/ 22 сентября 2011

Я бы посоветовал изменить тип возврата на byte[]. Это аккуратнее.

Stream реализует IDisposable, поэтому теоретически потребитель вашего метода должен будет вызвать ваш код в блоке using:

using (var receivedStream = new FileService().ServeHttpRequest(someUrl))
{
   // do something with the stream
}

Если вашему клиенту определенно необходим доступ к чему-то, что обеспечивает Stream, то непременно вернитесь и верните это, но, возвращая byte[], вы сохраняете контроль над всеми неуправляемыми ресурсами, которые скрыты под прикрытием. *

...