2013-04-09 12 views
56

ho il seguente decorato sul mio servizioWCF ExceptionShielding ID errore non corrisponde con handlingInstanceId passato al Handler

<ExceptionShielding("MyExceptionPolicyName")> 

quando viene generata un'eccezione di errore, la mia politica raccoglie l'errore e log in bene. Prende l'ID di gestione della sostanza e lo registra insieme all'errore come riferimento. Quello che sto notando, è il Guid restituito nell'errore "ID errore:" è diverso da quello passato nel codice di istanza di gestione.

ho provato anche per decorare l'operazione in questo modo

<FaultContract(GetType(ValidationFault))> 

ma questo produce gli stessi risultati.

Quello che mi piacerebbe fare è un po 'come catturare quel "ID errore:" restituito al consumatore in modo che possa accedere con l'eccezione. * informazioni aggiuntive: il gestore criteri di eccezione è personalizzato e accetta un'eccezione e registra le varie proprietà e dati in uno schema db del registro eccezioni specifico.

Qualcuno sa come realizzare questo?

UPDATE: per commentare @Jay Patel s', ho aggiunto questo al mio config per attivare l'analisi

<system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing" 
       propagateActivity="true"> 
     <listeners> 
      <add name="traceListener" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData= "c:\Temp\Traces.svclog" /> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 

ho quindi eseguito una richiesta per ottenere una reazione all'anomalia protetta da una schermatura eccezione. La stringa di risposta all'errore è formattata in questo modo: "Si è verificato un errore durante il consumo di questo servizio .Per ulteriori informazioni contattare l'amministratore ID errore: {GUID}"

Ho quindi visualizzato il registro di traccia e non ho trovato alcuna prova del GUID o questa stringa.

Ecco il link per il pastebin TraceLog per tutti coloro che si preoccupa per vedere un esempio di uno quando si utilizza ExceptionShielding.

UPDATE2:

Anche in questo caso, per il commento di @Jay Patel, ha aggiunto questo. Ho provato -1 e il valore int massimo per il maxMessageLog per garantire che sto ottenendo la maggior quantità di dati nel registro.

<diagnostics> 
    <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="2147483647" /> 
</diagnostics> 

Il registro non è utile. Include niente su qualcosa che sia ancora vicino alla mia domanda.

Per chiarire nel caso in cui non è chiaro al di sopra ... io voglio essere in grado di catturare il GUID dopo il "ID errore:" nel messaggio al client in modo da poter accedere con l'eccezione che è registrato dal gestore delle eccezioni. In questo modo i clienti possono contattare l'"Amministratore" come dice il messaggio con l'ID errore, ed essere effettivamente in grado di trovare qualcosa.

Ecco la traccia completa abilitata pastbin

+0

Quindi, ho già messo una taglia una volta su questo. Se qualcuno ad un certo punto si avvicina a una risposta, farò il possibile per rinunciarvi a una taglia di 50 punti (non sono nemmeno sicuro se riuscite a farlo, ma se arriva una risposta e mi piace, Pubblicherò una taglia e ricompenserò quella persona ... se è un no no qui sullo stack ... beh ... ti darò un cinque virtuale e dirò grazie :) – wakurth

+1

Non che sarebbe di aiuto ma hai te provato la registrazione usando Traccia in [Traccia WCF] (http://msdn.microsoft.com/en-us/library/ms733025.aspx) Vedi lo stesso ID di errore qui? –

+0

Non ho. Controllerò. La società per cui lavoro ha un contatto presso la MS, a cui ho inviato questa domanda, e mi è stato detto che l'avrebbero passata al team EntLib in MS e mi avrebbe dato una risposta. Nel frattempo, proverò il tracciamento WCF e vedrò se è utile indicarmi la direzione di come acquisire questo valore sul lato server. Grazie. – wakurth

risposta

1

Secondo http://msdn.microsoft.com/en-us/library/ff649012.aspx:

È inoltre possibile specificare una fonte di "{GUID}" per aggiungere l'attuale Handling ID istanza alla proprietà Fault contratto.

Nel file .config:

<mappings> 
    <add source="{Guid}" name="HandlingInstanceId" /> 
</mappings> 

Nel vostro ValidationFault FaultContract:

[DataMember] 
public Guid HandlingInstanceId { get; set; } 

Nota: Il "{GUID}" fonte sembra essere un marcatore speciale per la gestione ID istanza.

Consulta anche: http://entlib.codeplex.com/discussions/232049

E, le ultime 2 voci: http://entlib.codeplex.com/discussions/243558

+0

Questo aggiunge esso (l'id dell'istanza di gestione) per l'errore di convalida stesso restituito al consumatore, ma non mi aiuta con la mia domanda, che è come acquisire "ID errore: {GUID}". Catturare quel GUID è specificamente quello che ho delineato nella domanda – wakurth

1

è la registrazione dei messaggi sarà utile? Se quindi credo che avete bisogno di qualcosa di simile nella configurazione:

<source name ="System.ServiceModel.MessageLogging" 
     switchValue="Verbose, ActivityTracing">   
<listeners> 
    <add name="xml" /> 
</listeners> 

Si prega di notare che il nome fonte qui è 'System.ServiceModel.MessageLogging' e non 'System.ServiceModel'.

Per l'esempio completo si veda questo articolo: http://msdn.microsoft.com/en-us/library/dd788183.aspx

Spero che questo vi aiuterà.