Принуждение прокси-сервера ASMX к использованию XmlSerializer вместо DataContractSerializer

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

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

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

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

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

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

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

Ответ 1

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

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

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