如何拦截WCF客户端的原始SOAP请求/响应(数据)

10

这个问题似乎非常接近我正在寻找的内容 - 我已经设置了跟踪,现在正在查看我的调用服务的日志条目。

但是我需要查看发送到服务的原始SOAP请求数据,但是我无法从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

我最近遇到了与原问题更新中相同的问题:跟踪显示已发送消息,但消息本身不存在。对我来说,解决方法是添加一个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部分:

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

一旦我添加了 MessageLogging 源,TraceViewer 就会显示包含实际 SOAP 消息的“消息日志跟踪”跟踪信息。


11

您没有一个特定的选项卡显示仅SOAP消息 - 但XML选项卡包括整个SOAP消息 - 是吗?

alt text

这份XML的片段中,您缺少了什么吗?

更新: John,很遗憾,您没有展示出您的<system.serviceModel>/<diagnostics>部分是什么样子 - 我用于此结果的部分如下所示:

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

你的设置和他人一样吗?也许你缺少了logEntireMessage或其他东西?


1
很酷 - 但似乎它不能与源--> name="System.ServiceModel"一起工作,而它可以与源--> name="System.ServiceModel.MessageLogging"一起工作。 - JohnIdol
日志似乎无法很好地刷新 - 我必须等待几分钟才能看到条目,并且在打开时会出现大量错误。是否有一些进程需要终止以使其持久化或其他提示可以分享? :) - JohnIdol
1
@JohnIdol:不太确定 - 我相信你可以在XmlWriterTraceListener上设置几个选项来影响文件的写入/刷新速度。查看MSDN文档以获取更多信息!http://msdn.microsoft.com/en-us/library/system.diagnostics.xmlwritertracelistener.aspx - marc_s
2
这个做法行得通 --> <trace autoflush="true" /> :) - 现在我已经准备好了,谢谢! - JohnIdol
嘿,马克 - 我能从这个日志中看到HttpHeaders吗?我遇到了一个问题,通过HttpHandler进行服务调用非常缓慢,唯一剩下的要检查的就是Http Headers --> https://dev59.com/iU3Sa4cB1Zd3GeqPzOzA#2877038 - 如果你知道的话,你可以回答这个新问题! :) - JohnIdol
显示剩余6条评论

0

有另一种方法可以查看XML SOAP - 自定义MessageEncoder。与IDispatchMessageInspector / IClientMessageInspector的主要区别在于它在更低的级别上工作,因此它捕获原始字节内容,包括任何格式不正确的xml。

为了使用这种方法实现跟踪,您需要使用自定义消息编码器将标准textMessageEncoding包装为新的绑定元素,并将该自定义绑定应用于配置中的端点。

你也可以看看我的项目,例如我是如何做到的 - 包装 textMessageEncoding,记录 编码器,自定义绑定 元素配置


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接