Клиент службы WCF: как отладить разбор ответа - PullRequest
2 голосов
/ 28 декабря 2011

Я создаю клиент веб-службы для взаимодействия с удаленной веб-службой (на основе Java) вне моего контроля.Я могу вызвать операцию веб-службы и определить, анализируя пакеты, что служба отвечает заполненными данными.Однако к тому времени, когда ответ превращается в код клиента, ответ представляет собой только оболочку со всеми данными, равными NULL.

Я подозреваю, что в веб-службе возникает ошибка, из-за которой данные отбрасываются или игнорируются, но я не могу найти способ включить отладку (или даже журналы или сообщения об ошибках).?) во время получения ответа, прежде чем он попадет в мой код клиента.

В моем App.config включена регистрация сообщений, но регистрируются только исходящие сообщения:

<system.diagnostics>
    <sources>
        <source name="System.ServiceModel.MessageLogging">
            <listeners>
                <add name="messages"
                type="System.Diagnostics.XmlWriterTraceListener"  
                initializeData="c:\messages.svclog" />
            </listeners>
        </source>
    </sources>
</system.diagnostics>

<system.serviceModel>
    <diagnostics>
        <messageLogging
             logEntireMessage="true"
             logMalformedMessages="true"
             logMessagesAtServiceLevel="true"
             logMessagesAtTransportLevel="true"
             maxMessagesToLog="3000"
             maxSizeOfMessageToLog="2000"/>
    </diagnostics>
</system.serviceModel>

Я действительно хочу установить точку останова во время фактического анализа ответного сообщения, ноРегистратор сообщений фактически регистрирует ответ, также может немного помочь.

Я также настроил пользовательский MessageEncoder, который был необходим для обхода ошибки в парсере удаленной службы.Я могу добавить точки останова к ReadMessage методам на этом MessageEncoder, и могу видеть, что данные все еще там в этой точке.Однако следующий шаг возвращается к клиентскому коду, и объект Response пуст - нет предупреждений или сообщений.Есть ли какой-нибудь способ увидеть, что происходит между ними?

Итак, я полагаю, что в конечном итоге это будет вопрос из двух частей:

  1. Как / Где можно установить точку останова нанаблюдать за обработкой SOAP-сообщения после MessageEncoder, но до его отправки клиентскому коду?
  2. Что не так с моей конфигурацией регистрации, что только исходящие сообщения регистрируются?

1 Ответ

6 голосов
/ 20 января 2012

Вот как вы можете заставить трассировку ответа работать на вас:

1. Конфигурация

<system.diagnostics>
<sharedListeners>
  <add name="sharedListener"
       type="System.Diagnostics.XmlWriterTraceListener"
       initializeData="C:\LogFiles\messages.svclog" />
</sharedListeners>
<sources>
  <source name="System.ServiceModel" switchValue="Verbose, ActivityTracing" >
    <listeners>
      <add name="sharedListener" />
    </listeners>
  </source>
  <source name="System.ServiceModel.MessageLogging" switchValue="Verbose">
    <listeners>
      <add name="sharedListener" />
    </listeners>
  </source>
</sources>
</system.diagnostics>
<system.serviceModel>
<diagnostics performanceCounters="All" wmiProviderEnabled="True">
  <messageLogging
       logEntireMessage="True"
       logMalformedMessages="True"
       logMessagesAtServiceLevel="True"
       logMessagesAtTransportLevel="True"
       maxMessagesToLog="3000"
       maxSizeOfMessageToLog="30000"/>
</diagnostics>
</system.serviceModel>

Это находится в вашем app.config / web.config под узлом конфигурации.

2. Поиск ответа

Чтобы быстро убедиться, что вы действительно получаете ответы службы от удаленной службы, нужно открыть файл журнала в виде XML-файла в Visual Studio и выполнить поиск

Source="TransportReceive"

вы должны увидеть, что ответила удаленная служба в этом узле MessageLogTraceRecord.

3. Инструментальное

Рекомендуемый инструмент для просмотра этих сообщений: SvcTraceViewer.exe

Вы можете найти это в:

C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\x64

или

C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin

Если у вас нет этого инструмента, вы можете найти его в Windows Sdk

...