5

ここで同様の質問を見てきましたが、答えが見つかりませんでした。WCF を使用してリモート アドレスへの接続を開くアプリがあります。タスク マネージャーからアプリを強制終了するか、アプリを不用意に閉じると、接続が開いたままになり、アプリを再起動すると、既に存在することを示す例外が発生します。このポートのリスナー。

いくつかの質問:

  1. プロセスを強制終了した後、そのような接続が開いたままになるのはなぜですか?
  2. プロセスが不当に終了した場合、どうすればこの接続を閉じることができますか?
  3. 新しい接続を作成する前に接続を閉じるにはどうすればよいですか?

サーバー側:

var url = Config.GetRemoteServerUrl();
var binding = new NetTcpBinding();

binding.Security.Mode = SecurityMode.None;
binding.ReliableSession.Enabled = Config.RelaiableSession;
binding.ReliableSession.InactivityTimeout = TimeSpan.MaxValue;
binding.MaxConnections = Config.MaxConcurrentSessions;
binding.ReaderQuotas.MaxArrayLength = Config.ReaderQuotasMaxArrayLength;
binding.MaxReceivedMessageSize = Config.MaxReceivedMessageSize;
binding.SendTimeout = new TimeSpan(0,0, 0, 0,Config.SendTimeout);
binding.OpenTimeout = new TimeSpan(0,0, 0, 0,Config.OpenTimeout);

host = new ServiceHost(ServerFacade.Instance, new Uri[] { new Uri(url) });

host.AddServiceEndpoint(typeof(ITSOServiceContract), binding, url);

host.Open();

serverFacade = host.SingletonInstance as IServerFacade;
4

1 に答える 1

0

Channel_Closed イベント ハンドラーを追加し、Abort() メソッドを使用して強制的に破棄することができます。

    OperationContext.Current.Channel.Closed += channelClosed;


    void Channel_Closed(object sender, EventArgs e)
    {
        var success = false;
        try
        {           
           proxy.Close();
           success = true;
        }
        finally
        {
          if (!success) proxy.Abort();           
        }
    }
于 2013-03-21T09:35:41.620 に答える