2009-06-15 60 views
4

我試圖將ASP.Net Web服務轉換爲WCF應用程序。客戶端位於不支持WCF的.Net Compact Framework上,因此我需要確保WCF始終支持ASP樣式的Web服務。當我在Visual Studio中添加Web服務引用時,生成的代理類的方法有額外的參數。爲什麼我的wcf Web服務參考中有額外的參數?

例如,如果一個方法被定義爲:

public void GetEmpInfo(int empNo) 

這種方法會出現在代理類爲:

public void GetEmpInfo(int empNo, bool empNoSpecified) 

是什麼原因導致這一點,我怎麼得到它停止?

回答

8

看看這個blog post ...

沒有這些額外的布爾 「規定」的成員來自何處?他們做什麼 ?答案是WCF數據合同串行器 默認生成的模式 。由於 版本模式的工作原理, 串行器會生成所有數據成員 作爲可選元素。舊Web服務棧ASP.NET Web Services (「ASMX」)使用不同的序列化程序XmlSerializer,該程序維護了 完整的模式和XML保真度。所述 XmlSerializer的所有可選 元素映射到兩個成員:一個 表示數據本身,和一個 指定數據是否是 實際存在 - 這是 「xxxSpecified」構件。這些 xxx指定的成員必須設置爲 true才能使對應的「實際數據」 成員序列化爲 。

+0

僅供參考,使用SOAP 1.2的WSDL由Spring-WS在.net 3.5服務時,也參與這些額外的方法。 – 2009-07-22 03:53:52

1

.NET Compact Framework確實支持WCF的一個子集。您可以在MSDN上查看此支持。看一看,它可能足以支持您刪除舊版Web服務支持。

0

這發生在默認值爲非空的類型上。在這種情況下,這是不可能的網絡服務來了解一個參數是否設置爲默認值,或者根本就沒有設置在所有。

您可以通過與[XmlSerializerFormat]屬性像裝飾你的操作擺脫多餘的規格參數:

[OperationContract] 
    [XmlSerializerFormat] 
    string GetEmpInfo(int? empNo); 

這個屬性也可以在類的級別增加,這將使得在大多數情況下的感覺。

我明白了,你可以處理使用可空類型(int?)這種情況,但我無法用這個來修復它。