2012-07-21 88 views
1

我正在爲Web服務編寫一個「通用」客戶端,並遇到意想不到的問題。WCF和WSDL的代碼生成

ServiceDescription serviceDescription = ServiceDescription.Read(xmlTextReader(WSDL)); 
ServiceDescriptionImporter descriptionImporter = new ServiceDescriptionImporter(); 
descriptionImporter.ProtocolName = "Soap"; 
descriptionImporter.Style = ServiceDescriptionImportStyle.Client; 
CodeCompileUnit codeCompileUnit = new CodeCompileUnit(); 
CodeDomProvider codeDomProvider = CodeDomProvider.CreateProvider("CSharp"); 
codeDomProvider.GenerateCodeFromCompileUnit(codeCompileUnit, Console.Out, new CodeGeneratorOptions()); 

我使用的是暴露了一個簡單的WCF Web服務測試:我動態通過檢索Web服務的WSDL,並使用以下(簡化一點)代碼來生成客戶端代碼生成客戶端代碼兩種方法:

[OperationContract] 
int GetInteger(); 

[OperationContract] 
string GetString(); 

如果我檢查客戶端生成的代碼,然後我可以看到的GetString()返回一個字符串,但GetInteger()方法返回void!我認爲這與價值和參考類型有關。有什麼方法可以強制代碼生成器使GetInteger()方法返回一個int嗎?

+0

在C#中,'int'類型是一個原語,而'Integer'類型是一個對象,請嘗試使用'Integer'。 (字符串是System.String的別名,所以技術上沒有區別,這就是爲什麼你的GetString()方法返回字符串) – Mutant 2012-07-21 18:57:36

+0

我的印象是,你不能使用SOAP和WCF架構傳遞整數,但我可能是錯的 – l46kok 2012-07-21 19:00:10

+0

嗨 - 感謝您的評論。我不認爲C#中有整型,是嗎?然而,更重要的是,我希望我的客戶端應用程序能夠對付任何Web服務(我創建的服務僅僅是一個簡單的測試),因此我必須考慮Web服務具有上述方法的可能性。 – user304582 2012-07-21 19:54:23

回答

2

通過WCF返回一個int不應該是一個問題。

檢查生成客戶端生成代碼的代碼。

解決此問題的方法是返回具有單個屬性的對象,該屬性是int。

+0

生成客戶端代碼的代碼都是標準的C#類(參見上文)。我可能會濫用其中一個類,或者可能會設置一個標誌來獲得int返回值嗎? – user304582 2012-07-21 20:06:13

+0

檢查WSDL文件,是WSDL文件中的返回類型void? – 2012-07-21 20:10:50

+0

嗨 - 不,據我可以告訴這兩種收益類型是你所期望的: ' ' – user304582 2012-07-21 20:45:01

0

從各種實驗中,我認爲我的問題是使用ServiceDescriptionImporter生成客戶端代碼的固有限制。我將嘗試「升級」爲使用System.ServiceModel.Description.WsdlImporter和System.ServiceModel.Description.ServiceContractGenerator框架,希望能夠改進。