Ошибка синтаксического анализа 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, и используется следующим образом:
Скомпилируйте приложение, используя обычные сгенерированные VS (или сгенерированные wsdl.exe) прокси-классы (обычно они скрыты и находятся в файле с именем Reference.cs
Перейдите в командную строку Visual Studio и откройте папку Debug/Release (т. Е. Папку, в которую был скомпилирован исполняемый файл)
Введите в командной строке следующую команду (заменив TheApplicationName именем вашего приложения): SGEN /keep TheApplicationName.exe
Теперь вы увидите, что несколько файлов были созданы. Удалите все сгенерированные файлы, кроме файла.cs (включая созданную им dll)
Переместите файл.cs в исходную папку и включите его в свой проект.
Добавьте следующий атрибут в ваш файл Reference.cs:
[XmlSerializerAssembly()]
Теперь вы можете пройтись по фактическому коду сериализации и десериализации, чтобы найти реальную проблему (и, если нет другого способа решить проблему, вы можете изменить этот сгенерированный код по мере необходимости)
Кстати, .NET не использует MSXML. У него своя реализация. Производительность была бы ужасной, если бы XmlReader обращался к MSXML для каждого вызова Read.