Принудительное использование прокси-сервером ASMX XmlSerializer вместо DataContractSerializer - PullRequest
3 голосов
/ 23 ноября 2011

Нам предоставили внешние сервисы SOAP, которые мы должны использовать в нашем проекте. Все они предоставляют данные WSDL, но многие из них не являются .NET-сервисами (большинство из них были написаны на Java). Мы создали несколько клиентских прокси с помощью инструмента wsdl.exe. Этот инструмент делает то, что должен, он создает прокси для нас.

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

Например, если поле называется «Имя», наши прокси будут сериализовать его как «nameField». Я предполагаю, что это потому, что свойство с именем «Name» использует вспомогательное поле с именем «nameField». Службы на другой стороне, очевидно, не могут интерпретировать этот тип соглашения об именах.

Этого не произошло бы, если бы наши прокси-серверы ASMX использовали старый XmlSerializer, но по какой-то причине они выбрали DataContractSerializer, который полностью нарушает сериализацию и нарушает совместимость между клиентами и службами.

Мои коллеги прибегли к созданию вручную XML-данных и их последующей отправке с помощью класса HttpWebRequest. Я думаю, что это совершенно неприемлемо в 2011 году, для этого и предназначена автоматическая генерация прокси.

Мой вопрос: почему это происходит? Почему наши прокси используют DataContractSerializer и игнорируют все атрибуты сериализации xml в процессе? Есть ли способ заставить их снова использовать XmlSerializer?

Мы используем .NET 4.0.

1 Ответ

2 голосов
/ 23 ноября 2011

Если вы используете WCF, по умолчанию используется DataContractSerializer. И если типы не имеют явных маркеров [DataContract] / [DataMember], то DataContractSerializer будет использовать поля , что походит на происходящее.

Чтобы использовать XmlSerializer вместо этого, добавьте [XmlSerializerFormat] к вашей услуге . См. MSDN .

Вы также можете попробовать добавить [XmlType] или [XmlRoot] к своим классам (если его там еще нет).

...