Ошибка синтаксического анализа XML при обработке ответа SOAP

Я использую C# .Net 2.0 для написания клиента веб-сервисов. Мыльная реализация сервера протестирована и довольно солидна. У приложений gSoap/C++ не было проблем с чтением ответов. Однако при вызове одного из методов реализация.Net жалуется на "ошибка в XML-документе". Подобные ответы, полученные с сервера, были успешно обработаны парсером xml.

Похоже, мне синтаксический анализатор MSXML (я надеюсь, что именно тот, который используется.Net) является очень неумолимым парсером.

У меня нет контроля над сервером. Некоторые, как я должен обойти эту проблему. Итак, я думал о написании SoapExtension, как описано здесь

Поэтому мой вопрос заключается в том, могу ли я подключить анализатор перед этапом десериализации и полностью обойти этап десериализации.

И прежде всего, как я могу дать указание SOAP-заглушке использовать мой расширенный класс?

3 ответа

Решение

Прежде всего, я бы взял снимок сбойного XML на этапе десериализации, чтобы попытаться диагностировать проблему.

Вы можете подключить ваше мыльное расширение к клиентскому приложению без перекомпиляции. Просто добавь:

<webServices>
    <soapExtensionTypes>
        <add type="DebugTools.SOAP.SOAPTrace.SoapTraceExtension, DebugTools.SOAP" 
               priority="0" group="High"/>
    </soapExtensionTypes>
</webServices>

DebugTools.SOAP.SOAPTrace - это пространство имен SoapTraceExtension
DebugTools.SOAP - это имя сборки, содержащей код трассировки мыла.

в ваш файл app.config или web.config.

Было бы удобно, если бы вы могли вставить полное исключение с трассировкой стека. Там может быть что-то действительно очевидное. Также, если возможно, WSDL для веб-службы, это было бы очень полезно.

ура
Кев

Если вы хотите пройти через сериализацию / десериализацию кода, вы можете использовать инструмент под названием SGen. Это идет с VS в SDK, и используется следующим образом:

  1. Скомпилируйте приложение, используя обычные сгенерированные VS (или сгенерированные wsdl.exe) прокси-классы (обычно они скрыты и находятся в файле с именем Reference.cs

  2. Перейдите в командную строку Visual Studio и откройте папку Debug/Release (т. Е. Папку, в которую был скомпилирован исполняемый файл)

  3. Введите в командной строке следующую команду (заменив TheApplicationName именем вашего приложения): SGEN /keep TheApplicationName.exe

Теперь вы увидите, что несколько файлов были созданы. Удалите все сгенерированные файлы, кроме файла.cs (включая созданную им dll)

Переместите файл.cs в исходную папку и включите его в свой проект.

Добавьте следующий атрибут в ваш файл Reference.cs:

[XmlSerializerAssembly()]

Теперь вы можете пройтись по фактическому коду сериализации и десериализации, чтобы найти реальную проблему (и, если нет другого способа решить проблему, вы можете изменить этот сгенерированный код по мере необходимости)

Кстати, .NET не использует MSXML. У него своя реализация. Производительность была бы ужасной, если бы XmlReader обращался к MSXML для каждого вызова Read.

Другие вопросы по тегам