【问题标题】:Returning Azure BLOB from WCF service as a Stream - Do we need to close it?从 WCF 服务返回 Azure BLOB 作为流 - 我们需要关闭它吗?
【发布时间】:2011-09-21 20:41:04
【问题描述】:

我有一个简单的 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. 如果我将返回类型更改为 Byte[],缺点/优点是什么?

(我的客户端是Silverlight 4.0,以防万一有什么影响)

【问题讨论】:

    标签: wcf silverlight-4.0 azure azure-storage azure-blob-storage


    【解决方案1】:

    我会考虑将您的返回类型更改为byte[]。它更整洁。

    Stream 实现了IDisposable,因此理论上您的方法的使用者需要在using 块中调用您的代码:

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

    如果您的客户确实需要访问 Stream 提供的内容,那么请务必返回该内容,但通过返回 byte[],您可以控制任何隐藏在幕后的非托管资源。

    【讨论】:

      【解决方案2】:

      OperationBehaviorAttribute.AutoDisposeParameters 默认设置为 TRUE,这会在所有一次性的输入/输出上调用 dispose。所以一切正常。
      此链接:
      http://devdump.wordpress.com/2008/12/07/disposing-return-values/
      解释如何手动控制过程。

      【讨论】:

        猜你喜欢
        • 2016-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多