2012-12-19 148 views
23

我有一個服務接口,其方法的參數類型爲Stream。我應該關閉流後,我從這個流中讀取所有數據,或者當方法調用完成時由WCF運行時完成?是否需要關閉WebInvoke方法流

我見過的大多數例子都只是從流中讀取數據,但不要在流上調用Close或Dispose。

通常我會說我不必關閉流,因爲類不是流的所有者,但原因是爲什麼要問這個問題是我們目前正在調查我們的系統中的一個問題,使用HTTP-Post將數據發送到此服務的Android客戶端有時會打開未關閉的連接(使用netstat進行分析,其中列出了建立的Tcp連接)。

[ServiceContract] 
public interface IStreamedService { 
    [OperationContract] 
    [WebInvoke] 
    Stream PullMessage(Stream incomingStream); 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, UseSynchronizationContext = false)] 
public class MyService : IStreamedService { 

    public System.IO.Stream PullMessage(System.IO.Stream incomingStream) { 
     // using(incomingStream) { 
     // Read data from stream 
     // } 

     Stream outgoingStream = // assigned by omitted code; 
     return outgoingStream; 
    } 

配置的服務/結合

<webHttpBinding> 
    <binding name="WebHttpBindingConfiguration" 
      transferMode="Streamed" 
      maxReceivedMessageSize="1048576" 
      receiveTimeout="00:10:00" 
      sendTimeout="00:10:00" 
      closeTimeout="00:10:00"/> 
</webHttpBinding> 
+0

把它作爲評論,因爲我不是100%確定。我認爲你應該關閉'Stream',因爲對方在返回給你之前無法關閉它。我意識到這是 - 就像你說的 - 反直覺。另外,我不認爲一個開放的tcp連接與'Stream'開放有關......它可能會被關閉。 – pleinolijf

+4

@albertjan有沒有原因爲什麼你這樣寫評論或者你只是無法寫出整句話?我不明白你想說什麼。你能否詳細說明一下? – seba

回答

2

控制關閉的行爲或不關閉所述參數是所述OperationBehaviorAttribute.AutoDisposeParameters屬性,並且可以使用從真實與默認行爲偏離的屬性在參數退出該方法後關閉Stream參數。這就是你不經常看到明確關閉參數的原因。如果您想覆蓋默認行爲,則可以通過OperationCompleted事件進行明確的控制並且close the Stream once the operation has completed

public Stream GetFile(string path) { 
    Sream fileStream = null;  

    try 
    { 
     fileStream = File.OpenRead(path); 
    } 
    catch(Exception) 
    { 
     return null; 
    } 

    OperationContext clientContext = OperationContext.Current; 
clientContext.OperationCompleted += new EventHandler(delegate(object sender, EventArgs args) 
    { 
     if (fileStream != null) 
     fileStream.Dispose(); 
    }); 

     return fileStream; 
} 

請您收到的Stream自己副本,而不是一個參考客戶Stream頭腦,因此你有責任將其關閉。

相關問題