ho la consegna standard error in atto nel mio servizio:Come gestire gli errori WCF di basso livello?
- Ho un IErrorHandler agganciato al servizio per gestire gli errori imprevisti durante l'esecuzione del servizio.
- Ho provato/catturare blocchi in tutti i miei metodi di servizio per gestire i casi previsti.
Tuttavia, ci sono casi in cui vengono lanciate eccezioni sul server e nessuno dei due viene chiamato.
Ecco un caso in cui l'eccezione server non viene inviato al IErrorHandler:
Impostare la receiveTimout sul server vincolante per 5 secondi.
Sul client fare questo:
.
Service1Client sc = new Service1Client();
ICommunicationObject o = sc as ICommunicationObject;
o.Open(); // open channel
sc.GetData(10); // do a first call
Thread.Sleep(10000); // wait longer than the server receiveTimeout
sc.GetData(10); // Attempt another call: server throws a FaulException
In questo caso, l'errore viene generato sul server ma non riesco a trovare un modo per gestire la cosa (e di accedervi). So che un errore viene generato perché se allego un debugger sul processo del server e interrompo su tutte le eccezioni, il debugger si interrompe.
Ho trovato altri casi simili in cui gli errori di basso livello non vengono passati al mio programma.
Dove posso agganciare il mio codice per garantire che possa gestire TUTTE le eccezioni che si verificano sul server prima che vengano restituite all'app client? Devo implementare il mio proprio IChannel o qualche altra interfaccia di basso livello?
Grazie
UPDATE 21 Settembre 2009: Vedere this filo sul Microsoft WCF Forum. Probabilmente dovrò implementare il mio canale se voglio gestire questo tipo di eccezione. Aggiornerò di nuovo questo post quando avrò più informazioni.
Il binding del server receiveTimeout non dovrebbe essere in riproduzione qui - solo se ci vuole più di 5 secondi per ricevere risposta dalla chiamata a GetData(). Il tuo cliente che dorme per 10 secondi non ha alcun effetto. Supponendo che il servizio di test iniziale e l'aggiornamento del binding del server per impostare receiveTimeout su 5 secondi non riproducono il problema. Qual è l'errore che si riceve sul client? In realtà sospetto un binding/comportamento del server configurato in modo errato, specialmente se non si interrompe il servizio nel codice. Abilita il debug di WCF su client/servizio e guarda cosa mostra. –
Come descritto in MSDN, il server receiveTimeout è il tempo massimo che il server attenderà per un canale inattivo aperto. In tal caso la quantità di tempo è superiore. L'eccezione sul client è una MessageSecurityException che ha una FautException interna. La FaultException interna indica che il receiveTimeout ha superato. – Sylvain
Interessante. Immagino che potrebbe anche essere un indizio sul perché ha funzionato sulla prima chiamata e non sulla seconda. Puoi inoltrare un link alla documentazione a cui ti riferisci su receiveTimeout? Ho paura che la mia comprensione di questo valore sia difettosa. I documenti a cui faccio riferimento sono http://msdn.microsoft.com/en-us/library/ms731299.Aspx, grazie! –