2012-07-21 93 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框架,希望能够改进。