Подтвердить что ты не робот

WCF: Есть ли способ удалить поле ExtensionData?

Я только начал использовать WCF, и я уже пришел к проблеме изменения проекта. Я создал службу и разместил ссылку в веб-сервисе, но каждое поле в XML файле webservice поставляется с полем ExtensionData.

Пример:

удалена мертвая ссылка ImageShack

Я не хочу этого. Мне нужно это только:

удалена мертвая ссылка ImageShack

Есть ли способ удалить это поле? Некоторая разная сериализация?

4b9b3361

Ответ 1

ExtensionData на самом деле является функцией, которая должна быть встроена в тип, чтобы включить round-tipping. Он всегда испускается DataContractSerializer. Один из возможных способов подавления этого поля - использовать старый XmlSerializer, украсив ваш контрактный интерфейс обслуживания с помощью XmlSerializerFormatAttribute.

Ответ 2

Скорее всего, ваши классы DataContract будут реализовывать интерфейс IExtensibleDataObject, верно? Ответственный за поле ExtensionData - просто удалите этот интерфейс, и вы также сможете удалить поля ExtensionData из своих DataContracts.

Марк

Ответ 3

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

Вы можете избавиться от него, используя что-то другое, чем сериализатор DataContract (им думает старая школа [Serializable]), но я могу ошибаться.

Ответ 4

Устанавливая свойство null, чтобы он не появлялся в полученном xml:

foreach(var elem in arrayOfElements)
{
    elem.ExtensionData = null;
}

Ответ 5

Не отвечая на вопрос, но, возможно, это помогает...

Из MSDN http://msdn.microsoft.com/en-us/library/ms731083.aspx:

Функция кругового отключения может быть отключена либо установкой ignoreExtensionDataObject в true в конструкторе DataContractSerializer, либо установкой свойства IgnoreExtensionDataObject в true в атрибуте ServiceBehaviorAttribute. Когда эта функция отключена, десериализатор не заполнит свойство ExtensionData, и сериализатор не будет выдавать содержимое свойства.

Ответ 6

Если ваша проблема заключается в утверждении [TestMethod], вы можете использовать http://www.fluentassertions.com, чтобы исключить все свойства ExtensionData из ваших утверждений.

Eg.

objToCheck.ShouldBeEquivalentTo(expectedObj, options => options.Excluding(o => o.ExtensionData));

Ответ 7

украсьте свой ServiceImplementation с помощью [ServiceBehavior (IgnoreExtensionDataObject = true)]

[ServiceBehavior(IgnoreExtensionDataObject=true)]
public class Service : IService {}