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

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

Пример:

удалена неработающая ссылка на ImageShack

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

удалена неработающая ссылка на ImageShack

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


person Community    schedule 11.03.2009    source источник
comment
Не могли бы вы быть более конкретным? Что вы имеете в виду под каждым полем в ... xml-файле? XML-файлы не имеют полей. Где вы видите ExtensionData и почему это проблема?   -  person John Saunders    schedule 11.03.2009


Ответы (8)


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

person Darin Dimitrov    schedule 11.03.2009
comment
это глупо, потому что, если вы пытаетесь сравнить объект для PUT и убедиться, что тот же объект возвращается, ваши модульные тесты терпят неудачу из-за того, что это глупое поле имеет данные в ответе, но не в запросе - person PositiveGuy; 02.12.2014
comment
@MSSucks, может быть, ваши модульные тесты должны проверять свойства статически, а не с помощью поздней привязки или привязки во время выполнения? - person moarboilerplate; 19.08.2015

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

Марк

person marc_s    schedule 12.03.2009
comment
Но интерфейс неявный, так как же его убрать? - person SteveC; 08.12.2010

Установка свойства в null предотвращает его появление в результирующем xml:

foreach(var elem in arrayOfElements)
{
    elem.ExtensionData = null;
}
person Johnny5    schedule 04.03.2013
comment
Как бы мне не нравилось использовать хаки, это было очень быстрое (временное) решение. +1 - person Cody Stott; 16.01.2016

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

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

person Mike_G    schedule 11.03.2009

Не отвечая на вопрос, но, может быть, это поможет...

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

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

person Joe    schedule 11.03.2009
comment
Установка значения true не приводит к исчезновению свойства ExtensionData; он просто предотвращает отправку данных, если они существуют, клиенту. - person Darin Dimitrov; 12.03.2009

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

Eg.

objToCheck.ShouldBeEquivalentTo(expectedObj, options => options.Excluding(o => o.ExtensionData));
person Valerio Gentile    schedule 29.04.2015

Ваш класс не должен наследовать IExtensibleDataObject.

Пожалуйста, обратитесь к описанию круговой поездки ниже:

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

Чтобы включить отключение-отключение для определенного типа, тип должен выполнить

IExtensibleDataObject

интерфейс.

Пользовательский интерфейс содержит атрибут ExtensionData (ExtensionDataObject). Свойство хранит любую информацию из будущих версий контракта данных, неизвестную текущей версии.

person BehrouzMoslem    schedule 03.03.2018

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

[ServiceBehavior(IgnoreExtensionDataObject=true)]
public class Service : IService {}
person Bwing    schedule 06.11.2011