WebInvokeのStreamメソッドを閉じる必要がありますか?

私は Stream 型のパラメータを持つメソッドを持つサービスインターフェイスを持っています。このストリームからすべてのデータを読み込んだら、ストリームを閉じるべきですか?これは、メソッド呼び出しが完了したときにWCFランタイムによって行われますか?

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

通常は私はクラスがストリームの所有者ではないのでストリームを閉じる必要はないと言いますが、その理由はなぜこの質問を聞いているのですか?現在我々のシステムの問題を調査中です。 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;
  }

サービス/バインディングの構成


  

23
私は100%確信していないので、コメントとしてこれを置く。私はあなたが Stream を閉じるべきだと思います。相手があなたを返す前にそれを閉じることができないからです。私はこれがあなたの言ったように、直感的ではないことを認識しています。また、私はオープンtcp接続が開いているストリームに関連しているとは思えません。
追加された 著者 pleinolijf,
@albertjanそのようなコメントを書いたり、文章全体を書くことができない理由はありますか?私はあなたが言うことを理解していません。あなたは詳細を教えていただけますか?
追加された 著者 seba,

1 答え

パラメータを閉じるかどうかの動作を制御するプロパティは、 OperationBehaviorAttribute.AutoDisposeParameters プロパティであり、 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;
}

Stream のコピーはクライアント Stream への参照ではなく、独自のコピーを受け取っていることに注意してください。 。

2
追加された