我已经从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名称空间。答案 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,所以这不再发生了。