0

REST 끝점을 노출하고 BLOB 컨테이너에서 파일을 가져 오는 간단한 WCF 서비스가 있습니다. 서비스는 파일을 스트림으로 반환합니다. Azure BLOB를 WCF 서비스에서 스트림으로 반환 - 스트림을 닫아야합니까?

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 []로 변경하면 Cons/Pro는 무엇입니까?

내가 byte[]에 반환 유형을 변경하는 것이 좋습니다 것

답변

0

기본적으로 OperationBehaviorAttribute.AutoDisposeParameters가 TRUE로 설정되어있어 일회용 인 모든 입력/출력을 처리합니다. 그래서 모든 것이 효과가 있습니다.
이 링크 :
http://devdump.wordpress.com/2008/12/07/disposing-return-values/
은 수동으로 프로세스를 제어하는 ​​방법을 설명합니다.

0

(내 클라이언트는 어떤 효과가 단지의 경우, 실버 라이트 4.0). 그것은 tidier. 이론적으로 당신의 방법의 소비자가 using 블록에 코드를 호출 할 필요가 있도록

StreamIDisposable 구현합니다

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

클라이언트가 확실히 부디 다음, Stream가 제공하는 무엇인가에 대한 액세스를 필요로하는 경우 계속해서 돌아가지만 byte[]을 반환하면 표지 아래 숨겨진 관리되지 않는 리소스를 계속 제어 할 수 있습니다.