56 votes

WCF ExceptionShielding ID d'Erreur ne correspond pas à handlingInstanceId passé de Gestionnaire

J'ai le texte suivant décorées sur mon service

<ExceptionShielding("MyExceptionPolicyName")>

lorsqu'une anomalie exception est levée, ma politique ramasse l'erreur et qui se connecte à l'amende juste. Il prend la handlingInstance Id et l'enregistre avec l'erreur de renvoi. Ce que j'ai remarqué, est le Guid retourné dans la Faute "Erreur de code:" est différent de celui que l'on est passé dans le traitement instanceId.

J'ai aussi essayé de décorer l'opération comme

<FaultContract(GetType(ValidationFault))>

mais cela produit les mêmes résultats.

Ce que j'aimerais faire, c'est une façon de capture que "l'ID d'Erreur:" transmises au consommateur, de sorte que je peux me connecter avec l'exception. *plus d'infos: la politique d'exception handler est un programme personnalisé qui prend une exception, et il enregistre les différentes propriétés et les données dans une exception spécifique journal db schéma.

Quelqu'un sait comment faire cela?

Mise à JOUR: par @Jay Patel 's commentaire, j'ai ajouté à ma config pour activer le suivi

<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>

J'ai ensuite exécuté une demande pour obtenir une réponse d'erreur protégé par l'exception de blindage. Le défaut de réponse de la chaîne est formaté comme suit: "Une erreur s'est produite lors de la consommation de ce service. Veuillez contacter votre administrateur pour plus d'informations. ID d'erreur: {GUID}"

J'ai ensuite regardé le journal de suivi, et n'a trouvé aucune preuve de l'GUID ou de cette chaîne.

Voici le pastebin lien vers le tracelog pour quiconque se soucie de voir, par exemple, lors de l'utilisation de ExceptionShielding.

UPDATE2:

Encore une fois, par @Jay Patel commentaire, ajouter cet. J'ai essayé -1 et max int valeur pour le maxMessageLog pour s'assurer que je suis la plus grande quantité de données dans une session.

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

Le journal n'est pas utile. Il comprend rien de rien, même à proximité pour répondre à ma question.

À préciser dans le cas où il n'est pas clairement indiqué ci-dessus... je veux être en mesure de capturer le GUID après la "ID d'Erreur:" dans le message vers le client, donc je peux me connecter avec l'exception qui est connecté par le gestionnaire d'exception. De cette façon, les clients peuvent contacter l'Administrateur", comme le dit le message avec l'ID d'Erreur, et d'être en mesure de trouver quelque chose.

Voici la trace complète activé pastbin

2voto

Daniel Holder Points 41

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

Vous pouvez également spécifier une Source de "{Guid}" pour ajouter la gestion de l'ID d'Instance du lieu de la Panne propriété de Contrat.

Dans votre .fichier de configuration:

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

Dans votre ValidationFault FaultContract:

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

Remarque: Le "{Guid}" source semble être un marqueur spécial pour le traitement de l'ID d'Instance.

Voir aussi: http://entlib.codeplex.com/discussions/232049

Et, les 2 dernières entrées: http://entlib.codeplex.com/discussions/243558

1voto

Tony Points 4360

est message de journalisation sera utile? Si donc je suppose que vous avez besoin de quelque chose comme cela dans votre config:

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

Veuillez noter que le nom de la source est ici 'Système.ServiceModel.MessageLogging "et non pas" du Système.ServiceModel'.

Pour l'exemple complet, veuillez consulter cet article: http://msdn.microsoft.com/en-us/library/dd788183.aspx

Espérons que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X