我刚开始使用WCF,而且我已经遇到了一个改变项目的问题。我创建了一个服务并在webservice中引用了引用,但webservice xml文件中的每个字段都带有一个ExtensionData字段。
例:
删除了死的ImageShack链接
我不想要这个。我需要它只是:
删除了死的ImageShack链接
有没有办法删除这个字段?一些不同类型的序列化?
ExtensionData实际上是必须构建到类型中以启用round-tripping的功能。它始终由DataContractSerializer发出。抑制此字段的一种可能方法是使用旧的XmlSerializer,通过使用XmlSerializerFormatAttribute修改服务契约接口。
最有可能的是,你的DataContract类将实现IExtensibleDataObject
接口,对吧?这是负责ExtensionData
字段 - 只需删除该接口,您也应该能够从DataContracts中删除ExtensionData
字段。
渣
ExtensionData用于维护可能共享不同版本的合同的服务之间的兼容性。传递消息时可以安全地忽略它。
您可以通过使用除DataContract序列化程序之外的其他东西(我想到的旧学校[Serializable])来摆脱它,但我可能是错的。
将属性设置为null
可防止它出现在生成的xml中:
foreach(var elem in arrayOfElements)
{
elem.ExtensionData = null;
}
没有回答这个问题,但也许这有助于......
来自MSDN http://msdn.microsoft.com/en-us/library/ms731083.aspx:
可以通过在DataContractSerializer构造函数中将ignoreExtensionDataObject设置为true或者通过在ServiceBehaviorAttribute上将IgnoreExtensionDataObject属性设置为true来关闭往返功能。当此功能关闭时,反序列化器将不会填充ExtensionData属性,并且序列化程序将不会发出该属性的内容。
如果您的问题是[TestMethod]的断言,您可以使用http://www.fluentassertions.com从断言中排除每个ExtensionData属性。
例如。
objToCheck.ShouldBeEquivalentTo(expectedObj, options => options.Excluding(o => o.ExtensionData));
您的类不应继承IExtensibleDataObject。
请参阅下面的Round-tripping说明:
当数据从新版本传输到旧版本并传输到新版本的数据协定时,会发生往返。旁路可确保不会丢失任何数据。关闭旁路使前面的类型与合同版本模型支持的任何未来更改兼容。
要为特定类型启用跳闸,应该执行类型
IExtensibleDataObject
接口。
用户界面包含ExtensionData(ExtensionDataObject)属性。该属性存储当前版本未知的数据协定的未来版本中的任何信息。
用[ServiceBehavior(IgnoreExtensionDataObject = true)]装饰你的ServiceImplementation
[ServiceBehavior(IgnoreExtensionDataObject=true)]
public class Service : IService {}