0

RESTエンドポイントを公開し、BLOBコンテナーからファイルをフェッチする単純なWCFサービスがあります。サービスはファイルをストリームとして返します。応答が行われた後、ストリームを閉じることについてこの投稿を見つけました:

http://devdump.wordpress.com/2008/12/07/disposed-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;
      }
}

だから私は2つの質問があります:

  1. 投稿に記載されているパターンに従う必要がありますか?
  2. リターンタイプをByte[]に変更した場合、短所/長所は何ですか?

(私のクライアントはSilverlight 4.0ですが、何らかの効果がある場合に備えて)

4

2 に答える 2

0

返品タイプをに変更することを検討しますbyte[]。きちんとしています。

Streamを実装するため、理論的には、メソッドのコンシューマーはブロックIDisposable内でコードを呼び出す必要があります。using

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

クライアントがStream提供するものに確実にアクセスする必要がある場合は、必ず先に進んでそれを返しますが、返すことで、byte[]隠れている管理されていないリソースを制御し続けることができます。

于 2011-09-22T10:59:34.807 に答える
0

OperationBehaviorAttribute.AutoDisposeParametersはデフォルトでTRUEに設定されており、使い捨てのすべての入力/出力でdisposeを呼び出します。したがって、すべてが正常に機能します。
このリンク:
http
://devdump.wordpress.com/2008/12/07/disposed-return-values/ は、プロセスを手動で制御する方法を説明しています。

于 2011-09-22T13:51:54.807 に答える