Abbiamo un servizio WCF che stiamo consumando da un'app Web. Il client che stiamo utilizzando è stato generato utilizzando l'opzione "Aggiungi riferimento servizio" di Visual Studio. Poiché si tratta di un'app Web e dal momento che la natura dell'app probabilmente porterà a sessioni relativamente brevi, abbiamo deciso di creare un'istanza del client quando un utente effettua l'accesso e di mantenerlo per tutta la durata della sessione, quindi gestire lo smaltimento di esso durante la sessione.Gestire il client WCF persistente che entra nello stato di errore
Questo mi porta alla mia domanda: stiamo cercando di decidere il modo migliore per gestire il canale del cliente che entra in uno stato Fault. Dopo la ricerca attorno ad alcuni, siamo arrivati fino a questo:
if(client.State = CommuncationState.Faulted)
{
client = new Client();
}
try
{
client.SomeMethod();
}
catch //specific exceptions left out for brevity
{
//logging or whatever we decide to do
throw;
}
Questo, tuttavia, non funziona a causa del fatto che, almeno nel nostro caso, anche se il servizio non è attivo il cliente indicherà il Open
stato finché non si tenta effettivamente di effettuare una chiamata che lo utilizza, a quel punto entra quindi nello stato Faulted
.
Quindi questo ci lascia fare qualcos'altro. Un'altra opzione che abbiamo trovato è stata:
try
{
client.SomeMethod();
}
catch
{
if(client.State == CommunicationState.Faulted)
{
//we know we're faulted, try it again
client = new Client();
try
{
client.SomeMethod();
}
catch
{
throw;
}
}
//handle other exceptions
}
Ma quell'odore. Ovviamente, potremmo evitarlo usando un nuovo client e smaltendolo per ogni chiamata. Sembra inutile, ma se è la strada giusta, immagino che sia quello che opteremo per. Quindi qual è il modo migliore per gestire con garbo la determinazione se il client è in uno stato di errore e quindi fare qualcosa al riguardo? Dovremmo davvero ricevere un nuovo cliente per ogni chiamata?
Un'altra cosa da tenere a mente: l'istanziazione del client e tutto questo controllo e gestione avviene in una classe wrapper per il client. Se lo facciamo nel modo in cui intendevamo, è trasparente per l'app stessa: effettuare chiamate e gestire le eccezioni non richiede alcun codice speciale.
Che cosa sta causando al client di entrare in uno stato di errore? Sono sempre stato in grado di avere un servizio WCF che restituisce un errore normalmente e il cliente può continuare a fare affari. Il server non risponde o qualcosa del genere? – Tridus
In questo caso, stiamo utilizzando l'appartenenza a ASP.NET e ci siamo imbattuti in esso superando l'attributo "userIsOnlineTimeWindow". Ovviamente in tal caso avrebbe senso semplicemente reindirizzare l'utente alla pagina di accesso, ma stiamo cercando di essere sicuri di essere pronti per qualsiasi altra situazione in cui potremmo entrare in uno stato di errore. – Zannjaminderson