从包含和基础对象的WCF restful响应中删除xml命名空间

时间:2013-06-19 18:42:22

标签: c# wcf .net-3.5 datacontractserializer

.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入门套件,我也不会。

2 个答案:

答案 0 :(得分:2)

尝试使用ContractNamespaceAttribute将所有合同成员移动到同一个XML命名空间。这将消除个别成员的xmlns属性。

答案 1 :(得分:1)

注意您是否正在使用类似Fiddler的内容来检查您的消息,因为它的XML视图会在命名空间中添加,以便让您更轻松。但是,这些名称空间不一定存在于原始原始视图中。

当我不需要时,我犯了试图研究这个问题的错误。

Xml视图

Fiddler在笔记中添加了命名空间。

enter image description here

原始视图

命名空间不存在的同一节点

enter image description here

现在我并不是说原始邮件中从来没有任何我不真正需要的名称空间 - 只是如果您使用Fiddler,情况可能不会像您担心的那样糟糕检查信息。