从svclog中提取SOAP消息

时间:2010-12-02 08:41:35

标签: .net logging soap trace

从svclog

中提取SOAP消息

大家好!

我在我的应用中启用了跟踪侦听来跟踪肥皂消息 看看这个:http://msdn.microsoft.com/en-us/library/ms732023.aspx

我的应用是网络.net服务的客户 所以现在我可以在svclog中收集信息了,好吧!

但是如何从中提取肥皂信息呢? 在日志中,肥皂信息以这种形式写成:
...
System.Net详细:0:[5344]来自ConnectStream的数据#53182860 ::写入 System.Net详细:0:[5344] 00000000:3C 3F 78 6D 6C 20 76 65-72 73 69 6F 6E 3D 22 31: System.Net详细:0:[5344] 00000010:2E 30 22 20 65 6E 63 6F-64 69 6E 67 3D 22 75 74:.0“encoding =”ut
System.Net详细:0:[5344] 00000020:66 2D 38 22 3F 3E 3C 73-6F 61 70 3A 45 6E 76 65:f-8“?> System.Net详细:0:[5344] 00000030:6C 6F 70 65 20 78 6D 6C-6E 73 3A 73 6F 61 70 3D:lope xmlns:soap =
System.Net详细:0:[5344] 00000040:22 68 74 74 70 3A 2F 2F-73 63 68 65 6D 61 73 2E:“http:// schemas。
System.Net详细:0:[5344] 00000050:78 6D 6C 73 6F 61 70 2E-6F 72 67 2F 73 6F 61 70:xmlsoap.org/soap
System.Net详细:0:[5344] 00000060:2F 65 6E 76 65 6C 6F 70-65 2F 22 20 78 6D 6C 6E:/ envelope /“xmln
System.Net详细:0:[5344] 00000070:73 3A 73 6F 61 70 65 6E-63 3D 22 68 74 74 70 3A:s:soapenc =“http:
System.Net详细:0:[5344] 00000080:2F 2F 73 63 68 65 6D 61-73 2E 78 6D 6C 73 6F 61://schemas.xmlsoa
System.Net详细:0:[5344] 00000090:70 2E 6F 72 67 2F 73 6F-61 70 2F 65 6E 63 6F 64:p.org/soap/encod
System.Net详细:0:[5344] 000000A0:69 6E 67 2F 22 20 78 6D-6C 6E 73 3A 74 6E 73 3D:ing /“xmlns:tns =

...

有一种方法可以从svclog文件中提取它们吗? 我无法修改代码,因此跟踪此内容的配置方式是我首选的解决方案。

谢谢! 南多

3 个答案:

答案 0 :(得分:1)

<?xmlversion="1.0" encoding="utf-8" ?>
  <configuration>
    <system.web>
      <webServices>
        <soapExtensionTypes>
          <add 
               type="MySoapExtensionLib.MyExtension, MySoapExtensionLib"
               priority="1"
               group="High" />
        </soapExtensionTypes>
      </webServices>
    </system.web>
  </configuration>here

根据我的需要:

  1. 不想触及现有代码
  2. 无法使用WCF(使用.NET 2.0)
  3. 记录SoapMessages的最佳方法是使用自定义SoapException创建备用SoapExceptionLib类库项目。 如果您编写自己的SoapException(在此示例中我们在MySoapExtensionLib库项目中声明了MyExtension),您可以使用配置在项目中启用它(因此对于您将要执行的所有Web服务调用)。 如果您只想要一些Web服务调用来使用您的扩展,则应使用属性。

    在CodeProject中查看此项目有一个工作示例:
    http://www.codeproject.com/KB/webservices/Soap_Extension_Progress.aspx
    希望这有帮助。
    再见,
    南多

答案 1 :(得分:0)

如果这是使用“添加服务引用”创建的客户端,则可以配置message tracing。这将以XML格式显示消息。

答案 2 :(得分:0)

我在几个月前使用过这段代码,但我不记得我在哪里找到它。 毕竟,它可以解决问题,但不是一个优雅的解决方案。

再见,Nando

        ...

    //call the web service method
    var myResponseData = ws.CallMyWebServiceMethod(myRequestData)
    //call this method just after the web servcice method call, or it will not work!
    DiagnoseResponseProblem();
    ...


    private void DiagnoseResponseProblem()
    {
        HttpContext hc = HttpContext.Current;
        string SoapResponse = null;
        string SoapRequest = null;

        // Post processing debugging pull out the actual soap message and debug it.
        if (hc != null)
        {
            SoapRequest = hc.Items["SOAPRequest"].ToString();
            SoapResponse = hc.Items["SOAPResponse"].ToString();
        }
        else
        {
            try
            {
                SoapResponse = System.Runtime.Remoting.Messaging.CallContext.GetData("SOAPResponse").ToString();
                SoapRequest = System.Runtime.Remoting.Messaging.CallContext.GetData("SOAPRequest").ToString();
                System.Runtime.Remoting.Messaging.CallContext.FreeNamedDataSlot("SOAPResponse");
                System.Runtime.Remoting.Messaging.CallContext.FreeNamedDataSlot("SOAPRequest");

                //NANDO: saving SOAP messages
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.LoadXml(SoapRequest);
                xmlDoc.Save(@"C:\temp\soap-request.xml");
                xmlDoc = new XmlDocument();
                xmlDoc.LoadXml(SoapResponse);
                xmlDoc.Save(@"C:\temp\soap-response.xml");
            }
            // Ignore...most likely this system does not 
            // have the remote message context setup.
            catch (Exception ex)
            {
                //...
            }
        }
    }