Как перехватить необработанный запрос / ответ мыла (данные) от клиента WCF - PullRequest
9 голосов
/ 10 мая 2010

Этот вопрос кажется довольно близким к тому, что я ищу - мне удалось настроить трассировку, и я просматриваю записи в журнале моих звонков в службу.

Однако мне нужно увидеть необработанный запрос мыла с данными, которые я отправляю в службу, и я не вижу способа сделать это из SvcTraceViewer (отображаются только записи журнала, но данные не отправляются в службу) - я просто отсутствует конфигурация?

Вот что я получил в своем web.config:

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

Любая помощь приветствуется!

ОБНОВЛЕНИЕ : это все, что я вижу в своем следе:

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

Ответы [ 3 ]

11 голосов
/ 01 августа 2011

Недавно я столкнулся с той же проблемой, что и при обновлении исходного вопроса: трассировка показала, что сообщение было отправлено, но самого сообщения там не было. Для меня исправлением было добавить источник System.ServiceModel.MessageLogging. Вот мой раздел конфигурации system.diagnostics:

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

И мой system.serviceModel / раздел диагностики:

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

Как только я добавил источник MessageLogging, TraceViewer показал трассировку «Message Log Trace», которая содержала фактические сообщения SOAP.

11 голосов
/ 10 мая 2010

У вас нет конкретной вкладки, которая показывает только сообщение SOAP - но вкладка XML действительно включает в себя все сообщение SOAP - нет ??

альтернативный текст http://i39.tinypic.com/j67rf7.jpg

Чтоотсутствует здесь из этого фрагмента XML здесь ??

ОБНОВЛЕНИЕ: Джон, вы, к сожалению, не показываете, как выглядит ваш <system.serviceModel>/<diagnostics> раздел - мой, используемый для этого результата, выглядит такэто:

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

У вас такие же настройки?Может быть, вам не хватает logEntireMessage или что-то еще ??

0 голосов
/ 01 июля 2018

Существует еще один способ просмотра XML SOAP - пользовательский MessageEncoder . Основное отличие от IDispatchMessageInspector / IClientMessageInspector заключается в том, что он работает на более низком уровне, поэтому он захватывает исходное содержимое байта, включая любой искаженный xml.

Чтобы реализовать трассировку с использованием этого подхода, необходимо обернуть стандартное textMessageEncoding с пользовательским кодировщиком сообщений в качестве нового связующего элемента и применить эту пользовательскую привязку конечная точка в вашей конфигурации .

Также вы можете видеть в качестве примера, как я это сделал в своем проекте - упаковка textMessageEncoding, регистрация кодер , пользовательская привязка элемент и config .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...