23

タイプがパラメータのメソッドを持つサービスインターフェイスがありますStream。このストリームからすべてのデータを読み取った後でストリームを閉じる必要がありますか、それともメソッド呼び出しが完了したときにWCFランタイムによってこれが行われますか?

私が見たほとんどの例では、ストリームからデータを読み取るだけで、ストリームでCloseまたはDisposeを呼び出さないでください。

通常、クラスがストリームの所有者ではないため、ストリームを閉じる必要はないと言いますが、この質問をする理由は、現在システムの問題を調査しているためです。一部のAndroidクライアントはHTTP-Postを使用してこのサービスにデータを送信すると、閉じられていない接続が開いている場合があります(確立され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>
4

1 に答える 1

2

パラメータを閉じるまたは閉じない動作を制御するプロパティはプロパティであり、メソッドを終了すると閉じられるパラメータOperationBehaviorAttribute.AutoDisposeParametersに関して、デフォルトのtrueの動作から逸脱するために使用できます。Streamこれが、パラメータの明示的な終了が頻繁に見られない理由です。デフォルトの動作をオーバーライドする場合は、 OperationCompletedイベントを介して操作が完了したら、明示的な制御を取得してストリームを閉じることができます。

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;
}

クライアントへの参照ではなく、独自のコピーを受け取っているため、それを閉じる責任があることに注意してください。StreamStream

于 2012-12-20T22:12:40.420 に答える