WCF: Есть ли способ удалить поле ExtensionData?
Я только начал использовать WCF, и я уже пришел к проблеме изменения проекта. Я создал службу и разместил ссылку в веб-сервисе, но каждое поле в XML файле webservice поставляется с полем ExtensionData.
Пример:
удалена мертвая ссылка ImageShack
Я не хочу этого. Мне нужно это только:
удалена мертвая ссылка ImageShack
Есть ли способ удалить это поле? Некоторая разная сериализация?
Ответы
Ответ 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 {}