【问题标题】:WCF and code generation from WSDL从 WSDL 生成 WCF 和代码
【发布时间】:2023-03-04 22:42:01
【问题描述】:

我正在为 Web 服务编写一个“通用”客户端,但遇到了一个意想不到的问题。我通过检索 Web 服务 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 服务对此进行测试:

[OperationContract]
int GetInteger();

[OperationContract]
string GetString();

如果我检查客户端生成的代码,我可以看到 GetString() 返回一个字符串,但 GetInteger() 方法返回 void!我认为这与值和引用类型有关。有没有办法强制代码生成器让 GetInteger() 方法返回一个 int?

【问题讨论】:

  • 在 C# 中,'int' 类型是原始类型,而 'Integer' 类型是对象,请尝试使用 'Integer'。 (字符串是 System.String 的别名。所以从技术上讲没有区别。这就是您的 GetString() 方法返回字符串的原因)
  • 我的印象是你不能使用 SOAP 和 WCF 架构传递整数,但我可能错了
  • 嗨 - 感谢您的 cmets。我认为 C# 中没有 Integer 类型,是吗?然而,更重要的是,我希望我的客户端应用程序能够针对任何 Web 服务(我创建的只是一个简单的测试服务),因此我必须考虑到 Web 服务具有上述方法的可能性。

标签: c# wcf wsdl


【解决方案1】:

通过 WCF 返回一个 int 应该不是问题。

检查生成客户端生成代码的代码。

解决这个问题的方法是返回一个对象,该对象具有一个 int 属性。

【讨论】:

  • 生成客户端代码的代码都是标准的 C# 类(见上文)。我可能滥用了其中一个类,或者是否可以设置一个标志来获取返回的 int?
  • 查看WSDL文件,WSDL文件中返回类型是否为void?
  • 嗨 - 不,据我所知,这两种返回类型都是您所期望的:<xs:element name="GetIntegerResponse"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="GetIntegerResult" type="xs:int"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="GetStringResponse"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="GetStringResult" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element>
【解决方案2】:

通过各种实验,我认为我的问题是使用 ServiceDescriptionImporter 生成客户端代码的固有限制。我将尝试“升级”以使用 System.ServiceModel.Description.WsdlImporter 和 System.ServiceModel.Description.ServiceContractGenerator 框架,希望能够改进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-05
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多