2009-12-18 14 views
14

Qual è il modo migliore per rilevare e registrare errori durante lo sviluppo di un livello di servizio WCF e perché?Il modo migliore per registrare errori in WCF

posso pensare a tre vie,

1) try manuale/catture intorno ad ogni metodo.

2) Lasciare la responsabilità al motore WCF.

3) Utilizzare una libreria di terze parti come Injection/Logging dei criteri di libreria Enterprise.

+1

Fare riferimento al seguente collegamento per l'impostazione di log4net con WCF. In ogni webmethod è possibile aggiungere informazioni di richiesta e risposta al file di registro. [http://paulthecyclist.com/tag/log4net/](http://paulthecyclist.com/tag/log4net/) – shazia

+0

Grazie per il link Shazia. Il link effettivo dovrebbe essere: http://paulthecyclist.com/2012/04/06/catch-all-wcf-errors/ però. – PaulTheCyclist

risposta

22

avrei implementare personalizzati IErrorHandler e utilizzare log4net

[AttributeUsage (AttributeTargets.Interface)] 
public class ErrorPolicyBehaviorAttribute : Attribute, IContractBehavior, IErrorHandler 
    { 
    private ILog m_logger; 

    #region IErrorHandler 

    public void ProvideFault (Exception error, MessageVersion version, ref Message fault) 
     { 
     return; 
     } 

    public bool HandleError (Exception error) 
     { 
     m_logger.Error (error.Message, error); 
     return true; 
     } 

    #endregion 

    #region IContractBehavior 

    public void ApplyDispatchBehavior (ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime) 
     { 
     ...init logger 
     ......Add this class to a list of dispatchRuntime.ChannelDispatcher.ErrorHandlers... 
     } 

    #endregion 
    } 

Questa classe implementa anche IContractBehavior, quindi è possibile utilizzarlo come attributo sui contratti di servizio.

[ErrorPolicyBehavior] 
public interface IYourServiceContract 
{ } 

log4net è abbastanza flessibile, quindi è possibile registrare ciò che è necessario e quando è necessario.

+4

Preferisco usare l'analisi .NET - è già integrata nel framework .NET ed è meno dipendente da un componente esterno. –

+2

@marc_s. Da .NET 1.1 mi sono abituato a log4net, poiché offriva molta più flessibilità rispetto alla traccia .NET standard. Una piccola e open-source (significa che puoi correggere bug lì se ne trovi una) la dipendenza da lib non è un grosso problema. – fspirit

+0

@fspirit, potresti fornire il codice completo della tua demo. Ho implementato lo stesso codice e introdotto l'eccezione DividedByZero in uno dei miei metodi di contratto. Tuttavia, il breakpoint non colpisce mai il metodo Handle Error. – Elangesh

1

Vorrei andare con il numero 1. Principalmente a causa di overhead ridotto rispetto al numero 3 e il numero 2 dovrebbe essere solo un no-no.

Concesso si desidera ancora accedere a qualcosa di simile a un file o un gestore eventi. Ma personalmente userò log4net perché è un po 'più leggero di tutte le cose di entlib.

+1

numero 1 è davvero un'opzione solo se ci si aspetta qualche altro lancio di codice ed eccezione e si desidera gestirlo in qualche modo per l'utente. Le eccezioni non gestite sono sempre possibili in .NET. Considerare quando l'eccezione viene sollevata dal servizio prima che il metodo stesso abbia la possibilità di chiamare.Mettendo un prova {...} catch (Eccezione e) {LogException (e)} sembra che tu stia sprecando il tuo codice con la logica che potrebbe essere gestita al meglio in una posizione centrale. – Rob

+0

Tendo ad essere d'accordo, provare a catturare il registro è un modo piuttosto gonfio per risolvere il problema, specialmente quando un comportamento di errore risolve questo problema. Il pubblico potrebbe anche voler guardare AOP, uno stile per prevenire questo stile ripetitivo di codifica: http://en.wikipedia.org/wiki/Aspetto- avanzato_programmazione. I comportamenti sono un modo per introdurre questi concetti quando si utilizza WCF – RhysC

2

Potrebbe essere utile per il check-out log4net. C'è un buon tutorial qui su CodeProject.

+0

Preferisco utilizzare l'analisi .NET - è già integrato nel framework .NET ed è meno dipendente da un componente esterno –

+1

Anche questo tutorial di log4net mi è piaciuto. Molto completo http://www.beefycode.com/category/log4net.aspx – ram

9

WCF può essere configurato per l'output di tracce per le pietre miliari del processo su tutti i componenti delle applicazioni, ad esempio chiamate di operazioni, eccezioni di codice, avvisi e altri eventi di elaborazione significativi.

Quello che segue è un esempio app.config per abilitare la traccia.

<configuration> 
    <system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" switchValue="Warning" propagateActivity="true" > 
     <listeners> 
      <add name="xml"/> 
     </listeners> 
     </source> 

     <source name="myUserTraceSource" switchValue="Warning, ActivityTracing"> 
     <listeners> 
      <add name="xml"/> 
     </listeners> 
     </source> 
    </sources> 

    <sharedListeners> 
     <add name="xml" 
      type="System.Diagnostics.XmlWriterTraceListener" 
      initializeData="TraceLog.svclog" /> 
    </sharedListeners> 

    </system.diagnostics> 
</configuration> 

Ulteriori informazioni su WCF Tracing sono disponibili a partire da MSDN: Configuring Tracing.

Microsoft fornisce un Service Trace Viewer Tool per leggere i file .svclog.

Oltre alla traccia, si può anche prendere in considerazione l'utilizzo di log4net per la registrazione nell'applicazione.

+1

se hai già impostato la traccia .NET, perché non utilizzare questa funzionalità anche per la registrazione delle applicazioni? Rimuove un'altra di quelle fastidiose dipendenze da componenti esterni, e funziona piuttosto bene, infatti, –

+1

@marc_s: Grazie per il suggerimento. Tuttavia, utilizzeresti ancora la traccia .NET per registrare eventi diversi dagli errori: come "access hits"? ... e applicheresti lo stesso ragionamento per l'ambiente live? –

2

Se si richiede la struttura di registrazione ELMAH è anche una buona opzione da considerare. Se non piace alla lettiera il codice con try/catch attorno ad ogni metodo, è possibile provare a utilizzare AOP frameworks che darebbe la possibilità di gestire le eccezioni contrassegnando il metodo con attributi

+0

Abbiamo avuto successo usando AoP tramite Unity Interface Interceptor. Bit di una curva di apprendimento, in particolare per quanto riguarda la gestione delle eccezioni, ma ora abbiamo un grande blocco di codice riutilizzabile che registra tutti i nostri I/O WCF a livello di informazioni (via log4net) –

+0

bella risposta Richard !! Lo aggiungerò alla mia lista "da imparare" – ram

Problemi correlati