WCF WSDL摆脱了qXX名称空间

时间:2012-11-24 21:43:41

标签: .net wcf wsdl .net-4.5

我已经从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名称空间。

2 个答案:

答案 0 :(得分:2)

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

在注释服务合同和数据合同时使用namespace属性。比如这样的东西: -

[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" />

答案 1 :(得分:1)

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

还要注意你序列化的内容,我有一个TimeSpan值,我不得不替换为int,所以这不再发生了。