2011-01-02 18 views
8

Sto solo imparando le corde attorno a WCF. Quello che stavo progettando di fare era aprire un canale duplex tra un client e un server usando NetTcpBinding e tenerlo aperto indefinitamente in modo che il server potesse avviare richieste al client.WCF: è una cattiva pratica lasciare un canale aperto per un lungo periodo?

Quindi mi sono imbattuto in questo blog by Jesse Ezell, che sembra indicare che è una brutta cosa mantenere un canale aperto indefinitamente, perché non è possibile rilevare i guasti e questo causa ogni sorta di instabilità.

È corretto? Se utilizzo NetTcpBinding e mantieni un riferimento a un canale aperto su entrambi i lati della relazione, cosa accade se si verifica un errore di comunicazione? Come posso rilevare l'evento di errore? Quali altri trucchi ci sono? C'è qualche differenza con il framework .NET che stai usando? (Sono su 4.0.)

risposta

13

non sono d'accordo con Jesse (come nota a margine: si raccomanda anche di utilizzare classi di servizio WCF come singletons di default, che è la peggiore idea mai a mio parere) .....

Fintanto che ci si prende cura di catturare le eccezioni sul server (ad esempio implementando l'interfaccia IErrorHandler nella classe di servizio), non c'è motivo di continuare a spegnere il canale ... specialmente non in un ambiente LAN aziendale utilizzando netTcpBinding.

Contrariamente ad es. una connessione al database che spesso comporta costi di licenza, mantenendo aperta una connessione di rete con la macchina di servizio non dovrebbe causare problemi. Di solito non è una risorsa limitata, quindi l'apertura e la chiusura costanti sembrano inutili.

Se si mantiene aperto il canale di servizio per un periodo di tempo più lungo, è necessario essere in grado dal lato client di gestire i guasti, ad es. è necessario essere in grado di recuperare da una situazione in cui il canale è diventato in errore, quando dopo tutto si è verificata un'eccezione (ad esempio, la rete è inattiva o qualcosa del genere).

Ma se lo fai, non vedo alcun vantaggio nel chiudere costantemente il canale dopo ogni chiamata e riaprire per il prossimo ...

6

Sì, è buona norma chiudere il canale non appena non è più necessario. Ma non è usuale in caso di comunicazione duplex. Quando si utilizza la comunicazione duplex è necessario un canale aperto per consentire al server di inviare messaggi al client. La comunicazione WCF viene sempre avviata dal client. La prenotazione è consentita solo mantenendo aperto il canale avviato dal cliente.

La comunicazione duplex comporta alcune attività aggiuntive per gestire i guasti di connessione. Il servizio dovrebbe contenere un meccanismo di ping per consentire al client di verificare la connessione in intervalli regolari. Se la connessione fallisce il client riceve un'eccezione e sarai in grado di ristabilire la connessione. Anche il servizio dovrebbe gestire l'eccezione quando si invia un messaggio di richiamata al canale guasto.

Problemi correlati