【问题标题】:How to intercept raw soap request/response (data) from WCF client如何拦截来自 WCF 客户端的原始肥皂请求/响应(数据)
【发布时间】:2011-02-17 15:46:57
【问题描述】:

This question 似乎与我正在寻找的非常接近 - 我能够设置跟踪,并且正在查看我对服务的调用的日志条目。

但是,我需要查看原始 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>

【问题讨论】:

    标签: asp.net wcf soap


    【解决方案1】:

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

    这里的 XML 的 sn-p 对您来说缺少什么?

    更新:约翰,很遗憾,您没有显示您的 &lt;system.serviceModel&gt;/&lt;diagnostics&gt; 部分的外观 - 我用于此结果的部分如下所示:

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

    你有相同的设置吗?也许你错过了logEntireMessage 或其他什么??

    【讨论】:

    • tnx 提供帮助 - 更新问题以显示我在 xml 中看到的内容。没有信封!我是否从配置中遗漏了什么?
    • 另外我似乎有不同版本的 svctraceviewer - xml 选项卡旁边的消息选项卡没有显示
    • 很酷 - 但它似乎不适用于 source --> name="System.ServiceModel" 而它适用于 source --> name="System.ServiceModel.MessageLogging"
    • @JohnIdol:不确定 - 我相信您可以在 XmlWriterTraceListener 上设置几个选项来影响文件写入/刷新的方式和速度。查看 MSDN 文档! msdn.microsoft.com/en-us/library/…
    • 这个成功了 --> :) - 我已经准备好了,谢谢!
    【解决方案2】:

    我最近遇到了与原始问题更新相同的问题:跟踪显示已发送消息,但消息本身不存在。对我来说,解决方法是添加一个 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 会显示包含实际 SOAP 消息的“消息日志跟踪”跟踪。

    【讨论】:

      【解决方案3】:

      还有另一种查看 XML SOAP 的方法 - custom MessageEncoder。与 IDispatchMessageInspector / IClientMessageInspector 的主要区别在于它在较低级别上工作,因此它捕获原始字节内容,包括任何格式错误的 xml。

      为了使用这种方法实现跟踪,您需要将标准textMessageEncodingcustom message encoder 包装为新的binding element,并将该自定义绑定应用到config 中的端点。

      你也可以看看我在我的项目中是如何做到的—— wrapping textMessageEncoding,记录 encoder,自定义绑定 elementconfig

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 2019-01-27
        • 1970-01-01
        相关资源
        最近更新 更多