web-dev-qa-db-fra.com

WCF - Inspecter les messages envoyés/reçus?

J'ai 2 solutions: - Solution serveur - Solution client

Le serveur s'enregistre auprès de mon IIS localhost: http: // localhost/MyApp/

Le client ajoute les services WCF (références de service) à partir de l’application localhost: http: //localhost/MyApp/MyService.svc

Lorsque je lance le client, je veux pouvoir voir les messages être échangés. J'ai téléchargé Fiddler, mais il ne semble pas vouloir me montrer le trafic envoyé sauf si j'utilise un navigateur Web. Est-ce que j'utilise mal Fiddler ou y a-t-il un autre outil que je devrais utiliser pour cela?


Pour clarifier, ce que je cherche à faire est de voir les messages réels transmis. Je ne veux rien faire avec eux, sauf les voir visuellement de mes propres yeux.

J'aime l'utilitaire de journal de service WCF, mais je ne pense pas avoir le paramètre correct. Je ne peux pas voir le message de savon, mais simplement qu'un message a été reçu.

Et aussi pour clarifier davantage, peu importe l'outil que j'utilise, du moment que je peux facilement voir les messages eux-mêmes.

37
michael

Pour afficher le contenu du message, vous devez ajouter une source pour System.ServiceModel.MessageLogging dans votre fichier de configuration. L'onglet Message dans Trace Viewer affiche le message complet pour un appel de service particulier.

Voici un exemple de fichier de configuration:

<configuration>

...

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

   <system.serviceModel>
   <diagnostics>
      <messageLogging logEntireMessage="true"
                                  logMalformedMessages="true"
                                  logMessagesAtServiceLevel="true"
                                  logMessagesAtTransportLevel="true"
                                  maxMessagesToLog="500"/>
   </diagnostics>

...

</system.serviceModel>

...

</configuration>

Consultez la rubrique Configuration du traçage sur MSDN pour plus d'informations. http://msdn.Microsoft.com/en-us/library/ms733025.aspx

39
Trevor

Peut-être me manque-t-il quelque chose, mais .... Pourquoi n'utilisez-vous pas les fonctions de traçage WCF? C'est un outil de dépannage fantastique. Je l'ai également utilisé pour des services hébergés dans IIS/WAS.

Activation du traçage WCF

En passant, certaines personnes l'ignorent, mais vous pouvez ouvrir des traces côté serveur et côté client en même temps, et le visualiseur vous montrera la corrélation entre les actions serveur et client dans un graphique de Nice.

EDIT: chaque fois que je devais capturer le trafic TCP/IP, j'utilise WireShark . Si vous avez besoin de le faire par programme, vous pouvez utiliser SharpPCAP , afin que je puisse agir sur ce que je capture sur le réseau. Mais pour le dépannage, il vaut beaucoup mieux compter sur le traçage WCF.

14
Haplo

Si vous voulez inspecter les messages par programmation, vous pouvez implémenter une interface IClientMessageInspector et l'enregistrer auprès de votre client.

Cela vous permet d'accéder à tous les messages, quelle que soit la liaison que vous utilisez, alors que utiliser des outils tels que Fiddler ne vous permettra d'inspecter les messages qu'en utilisant le canal de transport HTTP.

Notez qu'en utilisant cette technique, vous pouvez réellement modifier les messages ou en faire beaucoup plus (notifications de déclenchement, par exemple). Si tout ce que vous souhaitez faire est de placer votre attention sur le message, alors utiliser le traçage pourrait être une approche plus facile pour vous.

5
casperOne

Votre service est-il SOAP ou RESTful? Vous pouvez utiliser Outil WCF Service Trace Viewer pour afficher les en-têtes et les corps du message SOAP. Les instructions pour configurer votre service Web pour le traçage sont ici .

1
retrodrone

Regardez ce thread StackOverflow: Comment utiliser Fiddler pour surveiller le service WCF

Cela répond à certaines de vos questions. vous pouvez également utiliser quelque chose comme WireShark si vous voulez tout examiner sur le réseau plutôt que de configurer un proxy, comme le fait Fiddler. 

0
Gregory A Beamer

Dans WCF, nous pouvons utiliser un autre moyen de voir les messages SOAP réels - custom MessageEncoder - un point d'extensibilité de pipeline de bas niveau. Contrairement aux inspecteurs de message (IDispatchMessageInspector/IClientMessageInspector), il voit le contenu en octets d'origine, y compris les données XML mal formées. Vous devez encapsuler un élément textMessageEncoding standard en tant qu'élément custom binding et ajuster config file pour utiliser cette liaison personnalisée.

Vous pouvez également voir, par exemple, comment je l'ai fait dans mon projet - wrapping textMessageEncoding, logging encoder , liaison personnalisée élément et config .

0
baur