2009-09-24 102 views
1

我的问题是关于Java Web服务和C#.NET客户端之间的集成。为Java类型生成的重复C#web服务代理类

服务:CXF 2.2.3与宙斯盾数据绑定 客户端:C#,.NET 3.5 SP1

出于某种原因,Visual Studio生成的每个Java枚举两个C#代理枚举。生成的C#类不能编译。

例如,该Java枚举:

public enum SqlDialect { 
    GENERIC, SYBASE, SQL_SERVER, ORACLE; 
} 

可生产该WSDL:

<xsd:simpleType name="SqlDialect"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:enumeration value="GENERIC" /> 
     <xsd:enumeration value="SYBASE" /> 
     <xsd:enumeration value="SQL_SERVER" /> 
     <xsd:enumeration value="ORACLE" /> 
    </xsd:restriction> 
</xsd:simpleType> 

对于该WSDL,Visual Studio生成两个部分C#类(生成评论移除):

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")] 
[System.Runtime.Serialization.DataContractAttribute(Name="SqlDialect", Namespace="http://somenamespace")] 
public enum SqlDialect : int { 

    [System.Runtime.Serialization.EnumMemberAttribute()] 
    GENERIC = 0, 

    [System.Runtime.Serialization.EnumMemberAttribute()] 
    SYBASE = 1, 

    [System.Runtime.Serialization.EnumMemberAttribute()] 
    SQL_SERVER = 2, 

    [System.Runtime.Serialization.EnumMemberAttribute()] 
    ORACLE = 3, 
} 


[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3082")] 
[System.SerializableAttribute()] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://somenamespace")] 
public enum SqlDialect { 
    GENERIC, 
    SYBASE, 
    SQL_SERVER, 
    ORACLE, 
} 

生成的C#代码无法编译:

The namespace 'somenamespace' already contains a definition for 'SqlDialect' 

我会感谢任何想法...

+0

你是如何在Visual Studio中使用wsdl的?添加服务参考?添加Web引用?这个视觉工作室08(我认为)?您是否尝试过使用命令行手动使用服务? – dovholuk 2009-09-26 15:04:56

+0

抱歉,遗漏了详细信息 - 我正在使用Visual Studio 2008,添加服务参考,并尝试使用svcutils.exe获得相同的结果。 – Sergey 2009-09-29 13:12:41

回答

0

对于某些WSDL中,我曾产生额外的代码(在我的情况下,额外的类成员不存在)。这在尝试使用它时造成了问题,所以我刚刚删除了我确定为过量的代码并开始工作。我会尝试删除其中一个枚举并查看会发生什么。

+0

谢谢你的建议。我还手动编辑了代码,删除了第一个枚举类解决了编译问题。 但是,生成的代码中的错误只是更大麻烦的标志。例如: - C#客户端无法正确解组Java异常 - 任何服务器端异常信息丢失; - 空值不是C#空值,而是XmlNode对象。 – Sergey 2009-09-29 13:11:37

1

我发现什么“使”Visual Studio生成重复的代理类...我们的Web服务数据模型是多态的,并使用抽象类 - 这就是为什么我们使用Aegis数据绑定。 如果层次结构中有多个抽象类,Visual Studio将生成重复的代理。

例如,在此Web服务合同:

AbstractRestrictionDef getRestriction(...parameters...) 

这些类是行不通的:

abstract class AbstractModelObject -– abstract class AbstractRestrictionDef –- class SqlRestrictionDef 

但这些类将:

abstract class AbstractModelObject -– class AbstractRestrictionDef -– class ParsedRestrictionDef 
0

尝试添加服务作为.net 2的庇护;使用add service refferance>高级>添加web参考...

0

我想用Visual Studio 2008添加这个WSDL,它应该支持SOAP 1.1,使用soapUI应用程序或类似的应用程序来检查这个SOAP的版本。