Прокси-клиент WCF, созданный с использованием wsdl, не соответствующего атрибутам ServiceContract, XmlSerializerFormat - PullRequest
0 голосов
/ 11 ноября 2009



Я занимаюсь разработкой служб WCF в среде .net 3.5 и размещаю их в IIS 5.1 windows xp sp3 с basicHttpBiding .

Клиент, использующий службы разработано в рамках .net 2.0. Для этого я сгенерировал прокси-клиент с использованием WSDL.EXE. Этот инструмент генерирует прокси-класс без каких-либо проблем, но проблема, которую он добавляет для каждого свойства, добавляет дополнительное свойство "[property] Specified" , но это нормально работает без каких-либо проблем, нужно только указать "указано = true " при присвоении значения любому свойству

Чтобы удалить это дополнительное свойство, я добавил атрибут XmlSerializerFormat вместе с атрибутом ServiceContract . WSDL.EXE генерирует класс без дополнительного свойства, , но исключает некоторые классы, которые были включены ранее .

Есть ли какие-либо свойства, которые мне нужно установить для генерации исключенных классов?

Примечание. Все классы контрактов имеют атрибут DataContract , а свойства - DataMemeber .


NRK

Ответы [ 2 ]

3 голосов
/ 11 ноября 2009

XmlSerializer использует XmlIncludeAttribute вместо KnownTypeAttribute для обнаружения дочерних типов, которые не включены в контракты операций. Поэтому вы можете попробовать добавить их в базовый класс:

[XmlInclude(typeof(ChildClass1))]
[XmlInclude(typeof(ChildClass2))]
public class BaseClass {}
1 голос
/ 11 ноября 2009

Стандартный WCF DataContractSerializer будет сериализовать все, помеченное [DataMember] - независимо от видимости .NET (общедоступный / защищенный / частный / внутренний).

Когда вы переключаетесь на XmlSerializerFormat, поведение меняется - теперь XmlSerializer будет сериализовать все, что имеет видимость public, и на нем не отмечен [XmlIgnore].

Я бы предположил, что некоторые из ваших классов и участников не помечены public и, следовательно, больше не сериализуются. Кроме того, XmlSerializer требует, чтобы у классов был явный конструктор без параметров, который будет использоваться при десериализации - есть ли у всех ваших классов это? И конечно, этот конструктор также должен быть public.

...