WCF fornisce un insieme di funzionalità per il logging (disabilitate di default) per quanto riguarda le comunicazioni tra applicazioni client e server, al fine di facilitare il debugging soprattutto in scenari distribuiti in cui la diagnostica non è così immediata. Un metodo molto semplice e veloce per generare un log contenente le informazioni di diagnostica circa i messaggi in entrata ed in uscita è quello di specificare da configurazione un listener al trace source di default System.ServiceModel.MessageLogging e quindi impostare gli attributi dell'elemento messageLogging della sezione diagnostics. In particolare, è bene ricordare come sia possibile operare un log a diversi livelli di comunicazione: a livello di messaggio, a livello di trasporto ed a livello di servizio.
A tal proposito, ecco un esempio di configurazione che permette di tracciare messaggi a livello di servizio a partire da un file di log creato automaticamente tramite un XmlWriterTraceListener che automaticamente converte le informazioni di tracing e debugging in uno stream XML da persistere su file system.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add name="myWCFmessages" type="System.Diagnostics.XmlWriterTraceListener"
initializeData="C:\WCFLogs\messages.svclog"></add>
</listeners>
</source>
</sources>
<trace autoflush="true"></trace>
</system.diagnostics>
<system.serviceModel>
<diagnostics>
<messageLogging logEntireMessage="true" logMessagesAtServiceLevel="true"
logMessagesAtTransportLevel="false"
maxMessagesToLog="100" logMalformedMessages="false"
maxSizeOfMessageToLog="2000">
</messageLogging>
</diagnostics>
</system.serviceModel>
</configuration>
A questo punto, uno strumento molto potente che possiamo utilizzare per analizzare i messaggi è il Service trace viewer (SvcTraceViewer.exe), il quale ci aiuta a visualizzare e filtrare i messaggi anche in scenari in cui si richiede una correlazione tra trace diversi. Veramente molto utile :)
Technorati tags: WCF