.NET 3.5
所以我经过一番挫折后才开始问这个问题。我遇到的主要问题是,正在序列化的类中的某些属性包括XML中的xmlns attibute。
特定属性位于对象的基类或对象内的对象上。我可以完全控制这些并将datacontract(NameSpace =“”)属性添加到我的所有数据协定中。
我并不担心顶级xmlns或xmlns:i,而只关注类中较低级别的xmlns。
请参阅Remove xml namespaces from WCF restful response
[DataContract(Namespace = "")]
BaseClass
{
[DataMember]
public string Name{get;set;}
}
[DataContract(Namespace = "")]
OtherClass
{
[DataMember]
public decimal Income{get;set;}
}
[DataContract(Namespace = "")]
DerivedClass
{
[DataMember]
public int Age{get;set;}
[DataMember]
public OtherClass Foo{get;set;}
}
在Derived类的序列化中,这是我在XML中获得的。
<DerivedClass
xmlns="http://IDontCareAboutThisOne"
xmlns:i="http://IDontCareAboutThisOneEither">
<Name xmlns="">iMortalitySX</Name>
<Age>30</Age>
<Foo>
<Income xmlns="">0.0</Income>
</Foo>
</DerivedClass>
这当然只是一个例子。另外,如果你很好奇,我已经通过WCF服务完成了这项工作,并直接使用DataContractSerializer获得了相同的结果(应该是这样)。我需要这个,因为旧网络上返回的数据量很大。我刮胡子的每一点都有很大的不同。
是的,我考虑过JSON,但客户要求驱动了XML。还有其他原因我不同意,但它需要是XML格式。另外,仅供参考,第三方序列化器不是此选项的选项。我被MS基地的东西困住了。我将此作为WebBehavior的WebHttpBinding公开,作为REST类型的服务。我不使用REST入门套件,我也不会。
答案 0 :(得分:2)
尝试使用ContractNamespaceAttribute将所有合同成员移动到同一个XML命名空间。这将消除个别成员的xmlns属性。
答案 1 :(得分:1)
注意您是否正在使用类似Fiddler的内容来检查您的消息,因为它的XML视图会在命名空间中添加,以便让您更轻松。但是,这些名称空间不一定存在于原始原始视图中。
当我不需要时,我犯了试图研究这个问题的错误。
Fiddler在笔记中添加了命名空间。
命名空间不存在的同一节点
现在我并不是说原始邮件中从来没有任何我不真正需要的名称空间 - 只是如果您使用Fiddler,情况可能不会像您担心的那样糟糕检查信息。