2012-11-24 70 views
3

我有WSDL從WCF服務導出應用singleWSDL參數。WCF WSDL擺脫qXX命名空間

有很多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的名稱空間字段相同的值。所以他們通過一切手段在一個名字空間。

我能以某種方式擺脫這些q1和q2 XML命名空間嗎? Web服務旨在用於各種環境(平臺/語言),因此更清晰的WSDL讓我更快樂。

例如,我可以像解決方法一樣,停止使用繼承,將基類內容複製到派生類,從而解決q2問題,但我不知道如何處理應用於方法參數類型的q1名稱空間。

回答

2

我認爲你需要做到以下幾點: -

標註您的服務合同和合同數據時使用的命名空間屬性。事情是這樣的,例如: -

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

我已經這樣做了。名稱空間字段在每個屬性上設置。所有名稱空間值都是相同的。 – adontz

+1

對不起@adontz我沒有正確地讀你的帖子,所以回答了錯誤的問題。我沒有看到擺脫qs:extension上的q2:EntityReferenceBase的顯而易見的方式。正如你所說的,你可以重構PrincipalReference,使它不會從基類繼承。另一件事你可以嘗試(我不知道這是否會起作用)將使EntityReferenceBase成爲一個抽象類 - 這可能會影響生成的xsd。 –

1

我有同樣的問題,奇怪的是它首先沒有這些q1,q2,q3前綴。 我正在使用DataContract序列化程序,我錯過了使用DataContract和DataMember屬性覆蓋所有需要的內容。之後,這些前綴消失了。

還要注意你的序列化,我有一個TimeSpan的值,我不得不將其替換爲一個int,這樣就不會再發生了。