我正在编写一个REST WCF服务,其中包含检索资源集合和单个资源的方法。我的资源是基于单个抽象类的类。在我检索集合的方法中,我有:
[WebGet(UriTemplate = "")]
[ServiceKnownType(typeof(File)), ServiceKnownType(typeof(Text))]
List<ResourceBase> GetCollection();
并生成如下所示的XML:
<ArrayOfResourceBase xmlns="..." xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ResourceBase i:type="Text">
...
</ResourceBase>
<ResourceBase i:type="File">
...
</ResourceBase>
</ArrayOfResourceBase>
我的单个对象方法如下所示:
[WebGet(UriTemplate = "{id}")]
[ServiceKnownType(typeof(File)), ServiceKnownType(typeof(Text))]
ResourceBase Get(string id);
并生成如下XML:
<Text xmlns="..." xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
...
</Text>
有没有办法让这两个xml部分看起来一样,那就是去除ArrayOf中的“i:type”标签...并将它们转换为标签名称,或者强制它们放在单个对象中响应?
答案 0 :(得分:0)
这里可能有几个解决方案,但我可以马上想到几个:
将DataContract类ResourceBase的自定义DataContract名称更改为始终为Text。像这样:
[DataContract(名称= “文本”)] class ResourceBase { ... }
将DataContractSurrogate插入此类型的特殊情况
插入自定义DataContractSerializerOperationBehavior,插入自定义DataContractSerializer子级,此类型的特殊情况
使用XmlSerializer。请参阅this blog post。