2013-05-24 17 views
5

Ho un servizio Windows che, all'avvio, apre alcuni servizi WCF per l'ascolto sulla porta 8000. Succede che questo servizio si arresti a volte a volte. Quando lo fa, la connessione TCP non viene rilasciato, causando in tal modo il mio servizio a un'eccezione se provo ad avviarlo nuovamente:Chiudi connessione TCP quando il processo proprietario è già stato ucciso

AddressAlreadyInUseException: There is already a listener on IP endpoint 0.0.0.0:8000

Alcune osservazioni:

  • Quando eseguono CurrPorts o netstat -ano, Vedo che la porta 8000 è ancora in uso (nello stato LISTENING) ed è di proprietà dell'ID processo XXX corrispondente al mio ID di processo. Ma il mio servizio è già andato in crash e non appare più nel Task Manager. Quindi non posso uccidere il processo per liberare la porta! Naturalmente, in esecuzione taskkill /PID XXX rendimenti:

    ERROR: The process "XXX" not found.

  • Quando si esegue CurrPorts o netstat -b, posso vedere che il nome del processo coinvolto nella creazione della porta di ascolto è System, e non come MyService.exe (che è MyService.exe quando il mio servizio è in esecuzione).

  • ho cercato di usare CurrPorts per chiudere la connessione, ma ho sempre il seguente messaggio di errore:

    Failed to close one or more TCP connections. Be aware that you must run this tool as admin in order to close TCP connections.

    CurrPorts Screenshot

    (Inutile dire, io faccio CurrPorts Esegui come amministratore. ..)

  • TCPView non è di grande aiuto neanche: il nome del processo associato alla porta 8000 è <non-existent> e l'esecuzione di "Termina processo" o "Chiudi connessione" non ha alcun effetto.

  • Ho provato a vedere se non c'era un processo figlio associato al PID XXX utilizzando Process Explorer, ma senza fortuna qui.

  • Se chiudo il servizio in modo corretto (prima che si blocchi), la connessione TCP viene rilasciata correttamente. Questo è normale, in quanto chiudo gli host del servizio WCF nell'evento OnStop() del mio servizio.


L'unico modo che ho trovato per rilasciare la connessione è quello di riavviare il server (che non è conveniente in un ambiente di produzione, come si può intuire). L'attesa non aiuta, la connessione TCP non viene mai rilasciata.

Come posso chiudere la connessione senza riavviare il server Windows?


PS: trovato somequestions estremamente simile alla mia.

+0

Cosa dice netstat -a -b -o? – user1764961

+0

hai detto "questo servizio si interrompe a volte" e "la connessione TCP non viene rilasciata". Innanzitutto perché il servizio si blocca? In secondo luogo, la connessione tcp è mai stata rilasciata (cioè se si aspettano 1, 5 o più minuti?) – wal

+0

non è irrilevante o almeno non la penso così. Ho avuto servizi di wcf che si bloccano e non tengono le connessioni TCP, quindi vale la pena investigare sul perché i crash sono. se si abbandona il servizio con grazia, rimane sulla connessione tcp? perché il tuo intero processo si blocca su un'eccezione del database (vuoi farlo?) - capisco che probabilmente non vuoi seguire questo percorso per rispondere a queste domande ma queste eccezioni/crash causano chiaramente alcuni problemi a monte – wal

risposta

0

Ti suggerisco di provare socket.ExclusiveAddressUse = false; Sebbene di solito non si intenda risolvere questo tipo di problemi.

Un altro work-around: individua l'altro processo del servizio e lo uccide manualmente nelle prime code line.

0

Ho avuto lo stesso problema e alla fine ho capito che il porto veniva tenuto aperto da un processo figlio che era stato sottoposto a sublaunching dal mio processo. Non sono sicuro del motivo per cui nessuno degli strumenti di sistema potrebbe dirmelo. La fine del processo figlio libera la porta.

Problemi correlati