WCF .NET: connessione persistente o Apri / Chiudi secondo le necessità?

1

Al momento ho un servizio Web .NET WCF in esecuzione in produzione. Direi il 95% delle volte che funziona in modo impeccabile e come previsto. Però; ci sono volte in cui lancio un'eccezione che dice.

CommunicationException: 
An unsecured or incorrectly secured fault was received from the other party. See the inner FaultException for the fault code and detail.

Ho cercato online la causa di questo problema, e sembra che questo stia accadendo quando un'eccezione viene lanciata sul lato Host Service, e non viene gestita correttamente e restituita al client. In questo caso il mio servizio è il cliente e una terza parte è l'host. Non posso chiedere in modo plausibile alla terza parte di modificare il codice per gestirlo meglio.

Ecco l'ipotesi da parte mia: una volta generata questa eccezione, chiude il canale tra client e host. Poiché non sto eliminando correttamente questa connessione, devo aspettare che si esaurisca prima di poterlo riportare indietro. Questo sembra essere di circa 30 secondi, che è un po 'troppo lungo per aspettarsi che gli utenti attenderanno. Penso di aver trovato una soluzione possibile.

Nella mia attuale implementazione sto istanziando il mio cliente all'inizio del mio programma e rendendolo una risorsa globale che può essere chiamata ovunque, se necessario. Mi chiedo se sia meglio usare un approccio come

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    //More codes here 
}

e usarlo in ogni luogo che il mio cliente ha bisogno di comunicare con l'host. Essenzialmente, solo la connessione è stata aperta quando ne avevo bisogno, e dopo averla eliminata.

Il rovescio della medaglia qui, suppongo, è che c'è un sovraccarico in più che sta succedendo dietro le quinte per aprire questa connessione e chiuderla ogni volta. Quindi, per me, dipende dal fatto che il throughput sia abbastanza alto da permettere che il mio processo venga effettuato aspettando questo sovraccarico ad ogni richiesta. In questo momento penso che ci siano solo circa 12 chiamate all'host un minuto, ma il problema è che arrivano in gruppi di tre e le tre richieste si verificano tutte nello stesso secondo, quindi è qui che il sovraccarico potrebbe essere l'interruttore.

Qualcuno sa qual è la migliore pratica?

    
posta Brandon 15.01.2015 - 13:54
fonte

1 risposta

3

Quindi, non sono sicuro che ciò che sto per dirti sia ancora corretto, ma secondo Mark Seeman nel suo libro " Iniezione delle dipendenze in .NET "afferma che:

Although the correct usage pattern concerning ADO.NET connections should be common knowledge, it's far less known that the same is true for WCF Clients. They should be closed as soon as we're finished with a particular set of operations on a service.

In base a questo punto di vista, credo che dovresti chiudere la connessione dopo ogni richiesta.

Detto questo, hai commentato che sono sempre in gruppi di 3. Potrebbe essere utile esercitarsi introducendo una cache / coda nel sistema in cui raccogli le richieste, quindi apri la connessione, elabori tutte le voci nel cache / coda, quindi chiudere la connessione.

Questa combinazione di entrambi gli aspetti potrebbe darti una soluzione al tuo problema, tuttavia potresti ancora scoprire che l'errore si verifica se viene generato dal lato server. In tal caso è ancora necessario implementare alcuni errori di gestione in esso.

    
risposta data 15.01.2015 - 14:06
fonte

Leggi altre domande sui tag