2013-03-21 1 views
5

Ho visto domande simili qui ma non ho trovato risposta. Ho un'app che usa WCF per aprire una connessione a un indirizzo remoto, a volte quando uccido l'app dal task manager o l'app si chiude in modo non vergognoso, la connessione rimane aperta e quando riavvio la mia app ottengo un'eccezione che mi dice che c'è già un ascoltatore su questa porta.Le connessioni TCPC WCF rimangono aperte quando il processo viene interrotto

alcune domande:

  1. perché tale collegamenti restano aperti dopo che ho ucciso il processo?
  2. Come posso chiudere queste connessioni quando il processo si chiude in modo non corretto?
  3. Come posso chiudere le connessioni prima di provare a crearne una nuova?

lato Serer:

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; 
+0

Potrebbe fornire qualche codice lato server – Alex

+0

aggiunto un certo codice – meirrav

risposta

0

Si può provare ad aggiungere gestore di eventi Channel_Closed e utilizzare il metodo() Abort per costringerlo a smaltire.

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();   
     } 
    } 
+0

cercherò di esso, sai perché la connessione rimane aperta? – meirrav

+0

@meirrav è il servizio Windows di self-host? – Alex

+0

è auto-host – meirrav