【问题标题】:WCF WSDL get rid of qXX namespacesWCF WSDL 摆脱 qXX 命名空间
【发布时间】:2012-11-24 21:43:40
【问题描述】:

我已从 WCF 服务导出 WSDL,并应用了单个 WSDL 参数。

有很多 qXX XML 命名空间,如以下片段中的类型和方法。

<xs:complexType name="PrincipalReference">
  <xs:complexContent mixed="false">
    <xs:extension base="q2:EntityReferenceBase">
      <xs:sequence/>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>


<xs:element name="GetPermissions">
  <xs:complexType>
    <xs:sequence>
      <xs:element minOccurs="0" name="principal" nillable="true" type="q1:PrincipalReference"/>
      </xs:sequence>
  </xs:complexType>
</xs:element>

PrincipalReference 类继承自 EntityReferenceBase。 PrincipalReference 和 EntityReferenceBase 都在同一个 C# 命名空间中,并且 DataContractAttribute 的 Namespace 字段的值相同。所以它们无论如何都在一个命名空间中。

我能否以某种方式摆脱这些 q1 和 q2 XML 命名空间? Web 服务旨在用于各种环境(平台/语言),因此 WSDL 越清晰,我就越快乐。

例如,作为一种解决方法,我可以停止使用继承,将基类内容复制到派生内容,从而解决 q2 问题,但我不知道如何处理应用于方法参数类型的 q1 命名空间。

【问题讨论】:

    标签: .net wcf wsdl .net-4.5


    【解决方案1】:

    我认为您需要执行以下操作:-

    在注释服务合同和数据合同时使用命名空间属性。例如这样的事情:-

    [ServiceContract(Namespace = "http://some.url/2012/11")]
    
    [DataContract(Namespace = "http://some.url/2012/11")]
    

    另外,当您设置端点时,请确保您设置了bindingNameSpace 属性:-

    <endpoint address=""
              binding="wsHttpBinding"
              bindingConfiguration="someBindingConfiguration" 
              bindingNamespace="http://some.url/2012/11"
              contract="Some.Contract" />
    

    【讨论】:

    • 我已经这样做了。命名空间字段设置在每个属性上。所有命名空间值都相同。
    • 对不起@adontz 我没有正确阅读您的帖子,所以回答了错误的问题。我看不到在 xs:extension 上摆脱 q2:EntityReferenceBase 的明显方法。正如您所说,您可以重构 PrincipalReference 以便它不会从基类继承。您可以尝试的另一件事(我不知道这是否可行)是使 EntityReferenceBase 成为一个抽象类 - 这 可能 对生成的 xsd 有影响。
    【解决方案2】:

    我有同样的问题,奇怪的是它首先没有这些 q1, q2, q3 前缀。 我正在使用 DataContract 序列化程序,但我错过了使用 DataContract 和 DataMember 属性覆盖我需要的所有内容。之后这些前缀就消失了。

    还要注意你序列化的内容,我有一个 TimeSpan 值,我必须将其替换为一个 int,这样就不会再发生这种情况了。

    【讨论】: