Извлечение SOAP-сообщений из svclog - PullRequest
1 голос
/ 02 декабря 2010

Извлечение SOAP-сообщений из svclog

Привет, ребята!

Я включил прослушивание трассировки в своем приложении для отслеживания мыльных сообщений.
Посмотрите на это: http://msdn.microsoft.com/en-us/library/ms732023.aspx

Мое приложение является клиентом для веб-службы .net.
Так что теперь я могу собирать информацию в svclog, ну!

Но как мне извлечь из этого сообщения мыла?В журнале мыльные сообщения были записаны в следующем виде:
...
System.Net Verbose: 0: [5344] Данные из ConnectStream # 53182860 :: Запись
System.Net Verbose: 0: [5344] 00000000: 3C 3F 78 6D 6C 20 76 65-72 73 69 6F 6E 3D 22 31: System.Net Verbose: 0: [5344] 00000010: 2E 30 22 20 65 6E 63 6F-64 69 6E 67 3D 22 75 74: .0 "encoding =" ut
System.Net Verbose: 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 Verbose: 0: [5344] 00000040: 22 68 7474 70 3A 2F 2F-73 63 68 65 6D 61 73 2E: "http://schemas.
System.Net Verbose: 0: [5344] 00000050: 78 6D 6C 73 6F 61 70 2E-6F 72 67 2F 73 6F 61 70: xmlsoap.org / soap
System.Net Verbose: 0: [5344] 00000060: 2F 65 6E 76 65 6C 6F 70-65 2F 22 20 78 6D 6C 6E: / envelope / "xmln
System.Net Verbose:0: [5344] 00000070: 73 3A 73 6F 61 70 65 6E-63 3D 22 68 74 74 70 3A: s: soapenc = "http:
System.Net Verbose: 0: [5344] 00000080: 2F 2F 73 63 68 65 6D 61-73 2E 78 6D 6C 73 6F 61: //schemas.xmlsoa
System.Net Verbose: 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 2220 78 6D-6C 6E 73 3A 74 6E 73 3D: ing / "xmlns: tns =

...

Есть ли способ извлечь их из файла svclog?
I не может изменить код, поэтому мой способ решения - это способ конфигурации.

Спасибо!
Nando

Ответы [ 3 ]

1 голос
/ 23 декабря 2010
<?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)

лучший способ зарегистрировать SoapMessages - создать запасной проект библиотеки классов SoapExceptionLib с пользовательским SoapException. Если вы напишите свое собственное исключение SoapException (в этом примере мы объявили MyExtension в библиотечном проекте MySoapExtensionLib), вы можете включить его во всем проекте (то есть для всех вызовов веб-служб, которые вы будете делать), используя конфигурацию. Если вы хотите, чтобы ваш внутренний номер использовали только некоторые вызовы веб-службы, используйте атрибуты.

Смотрите этот проект в CodeProject, чтобы получить рабочий пример:
http://www.codeproject.com/KB/webservices/Soap_Extension_Progress.aspx
Надеюсь, это поможет.
Bye,
Nando

0 голосов
/ 17 декабря 2010

Я использовал этот кусок кода несколько месяцев назад, но я не могу вспомнить, где я его нашел.В конце концов, это помогает, но не элегантное решение.

Пока, Нандо

        ...

    //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)
            {
                //...
            }
        }
    }
0 голосов
/ 02 декабря 2010

Если это клиент, созданный с помощью «Добавить ссылку на службу», то вы можете настроить отслеживание сообщений . Это покажет вам сообщения в XML.

...