Nel nostro servizio di flusso di lavoro WF4, cerchiamo di essere il più robusto possibile. Una delle cose che facciamo è quello di registrare gli errori all'interno HandleError e ProvideFault (IErrorhandler). La documentazione chiaramente che HandleError sarebbe il posto giusto per fare la registrazione, ma vedo alcune cose strane:HandleError vs incongruenze ProvideFault nel servizio del flusso di lavoro, come gestire?
vedo alcuni errori che scatenano solo ProvideFault, ma mai HandleError, un esempio è stato:
System.NullReferenceException: Il riferimento non impostato a un'istanza di un oggetto. a System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.GetInstanceAsyncResult.GetInstance() a System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.GetInstanceAsyncResult..ctor
Ci sono anche alcuni errori che scatenano solo HandleError , ma mai ProvideFault, un esempio è stato:
System.ServiceModel.CommunicationException: si è verificato un errore dalla pipe: la pipe è stata terminata. (109, 0x6d). a System.ServiceModel.Channels.PipeConnection.Read (Byte [] tampone, offset Int32, Int32 dimensioni, TimeSpan timeout) a System.ServiceModel.Channels.SessionConnectionReader.Receive (TimeSpan timeout)
Infine vi sono errori che scatenano sia, prima ProvideFault e poi HandleError (su un thread in background)
Se possibile, voglio registrare il corrispondente messaggio in arrivo, anche. Lo faccio con OperationContext.Current.RequestContext.RequestMessage.ToString() Questo di solito funziona solo in ProvideFault, in HandleError non abbiamo il RequestContext più
Così la mia conclusione è stata, per registrare tutti errori, devo accedere a entrambi i metodi. Ma questo porta a molte voci di registro duplicate, a causa di 3 ..
La mia soluzione attuale era di "ricordare" l'ultima eccezione registrata da ProvideFault, e ignorarla se la stessa eccezione entra in HandleError. Non mi sembra molto pulito.
Qualcuno ha un metodo migliore e affidabile per registrare tutti gli errori che possono accadere all'interno di un servizio WF?
E per favore non puntare a Logging exceptions in WCF with IErrorHandler inside HandleError or ProvideFault? come che non fornisce alcun aiuto.