10 Stimmen

Abfangen von Soap-Anfragen und -Antworten (Daten) vom WCF-Client

Diese Frage scheint dem, was ich suche, ziemlich nahe zu kommen - ich konnte die Verfolgung einrichten und sehe mir die Protokolleinträge für meine Aufrufe des Dienstes an.

Allerdings muss ich die rohe Soap-Anfrage mit den Daten sehen, die ich an den Dienst sende, und ich sehe keine Möglichkeit, das aus dem SvcTraceViewer zu tun (nur Log-Einträge werden angezeigt, aber keine Daten an den Dienst gesendet) - bin ich nur fehlende Konfiguration?

Hier ist, was ich in meiner web.config habe:

  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel"
              switchValue="Verbose"
              propagateActivity="true">
        <listeners>
          <add name="sdt"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData="App_Data/Logs/WCFTrace.svclog"  />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

Jede Hilfe ist willkommen!

UPDATE : Das ist alles, was ich in meiner Spur sehe:

<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
  <System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
    <EventID>262163</EventID>
    <Type>3</Type>
    <SubType Name="Information">0</SubType>
    <Level>8</Level>
    <TimeCreated SystemTime="2010-05-10T13:10:46.6713553Z" />
    <Source Name="System.ServiceModel" />
    <Correlation ActivityID="{00000000-0000-0000-1501-0080000000f6}" />
    <Execution ProcessName="w3wp" ProcessID="3492" ThreadID="23" />
    <Channel />
    <Computer>MY_COMPUTER_NAME</Computer>
  </System>
<ApplicationData>
  <TraceData>
    <DataItem>
      <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Information">
        <TraceIdentifier>http://msdn.microsoft.com/en-US/library/System.ServiceModel.Channels.MessageSent.aspx</TraceIdentifier>
          <Description>Sent a message over a channel.</Description>
            <AppDomain>MY_DOMAIN</AppDomain>
            <Source>System.ServiceModel.Channels.HttpOutput+WebRequestHttpOutput/50416815</Source>
            <ExtendedData xmlns="http://schemas.microsoft.com/2006/08/ServiceModel/MessageTraceRecord">
            <MessageProperties>
              <Encoder>text/xml; charset=utf-8</Encoder>
              <AllowOutputBatching>False</AllowOutputBatching>
              <Via>http://xxx.xx.xxx.xxx:9080/MyWebService/myService</Via>
            </MessageProperties>
          <MessageHeaders></MessageHeaders>
        </ExtendedData>
      </TraceRecord>
    </DataItem>
  </TraceData>
</ApplicationData>

11voto

marc_s Punkte 701497

Sie haben keine spezielle Registerkarte, die nur die SOAP-Nachricht anzeigt - aber die Registerkarte XML enthält die gesamte SOAP-Nachricht, oder?

alt text

Was fehlt Ihnen in diesem XML-Schnipsel hier?

UPDATE: John, Sie zeigen leider nicht, was Ihre <system.serviceModel>/<diagnostics> Abschnitt sieht so aus - der für dieses Ergebnis verwendete sieht so aus:

<diagnostics>
  <messageLogging 
      logMessagesAtTransportLevel="true" 
      logMessagesAtServiceLevel="false"
      logMalformedMessages="true" 
      logEntireMessage="true"
      maxSizeOfMessageToLog="65535000" 
      maxMessagesToLog="500" />
</diagnostics>

Haben Sie die gleichen Einstellungen? Vielleicht vermissen Sie logEntireMessage oder etwas anderes?

11voto

Nick Cecil Punkte 2860

Vor kurzem bin ich auf dasselbe Problem gestoßen wie in der Aktualisierung der ursprünglichen Frage: Die Ablaufverfolgung zeigte an, dass eine Nachricht gesendet worden war, aber die Nachricht selbst war nicht vorhanden. Für mich bestand die Lösung darin, eine System.ServiceModel.MessageLogging-Quelle hinzuzufügen. Hier ist mein system.diagnostics config Abschnitt:

<system.diagnostics>
   <sources>
      <source name="System.ServiceModel" 
              switchValue="Information, ActivityTracing" 
              propagateActivity="true" >
         <listeners>
            <add name="xml"/>
         </listeners>
      </source>
      <source name="System.ServiceModel.MessageLogging">
         <listeners>
            <add name="xml"/>
         </listeners>
      </source>
   </sources>
   <sharedListeners>
      <add name="xml" 
           type="System.Diagnostics.XmlWriterTraceListener" 
           initializeData="C:\logfiles\Traces.svclog" />
   </sharedListeners>
</system.diagnostics>

Und mein system.serviceModel / Diagnoseabschnitt:

<diagnostics>
   <messageLogging
      logMessagesAtTransportLevel="true"
      logMessagesAtServiceLevel="true"
      logMalformedMessages="true"
      logEntireMessage="true"
      maxSizeOfMessageToLog="65535000"
      maxMessagesToLog="500" />
</diagnostics>

Nachdem ich die MessageLogging-Quelle hinzugefügt hatte, zeigte der TraceViewer "Message Log Trace"-Spuren an, die die tatsächlichen SOAP-Nachrichten enthielten.

0voto

baur Punkte 1226

Es gibt eine weitere Möglichkeit, XML SOAP zu sehen - benutzerdefinierter MessageEncoder . Der Hauptunterschied zu IDispatchMessageInspector / IClientMessageInspector besteht darin, dass er auf einer niedrigeren Ebene arbeitet, d. h. er erfasst den ursprünglichen Byte-Inhalt, einschließlich etwaiger fehlerhafter XML-Dateien.

Um die Ablaufverfolgung mit diesem Ansatz zu implementieren, müssen Sie eine Standard textMessageEncoding con kundenspezifischer Nachrichtenkodierer wie neu verbindendes Element und wenden Sie diese benutzerdefinierte Bindung auf den Endpunkt in Ihrer Konfiguration .

Sie können auch als Beispiel sehen, wie ich es in meinem Projekt gemacht habe - Umhüllung textMessageEncoding, Protokollierung Encoder , individueller Einband Element y Konfiguration .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X