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?