Webreferences共享类

我用Java编写了一些SOAP Webservices,在JBoss 5.1上运行。 其中两个人共享一个类AddressTO。 Webservices正在我的ApplycationServer上正确部署,一切顺利,直到我尝试在C#-client中使用class addressTO。 客户端应用程序中有两种类型,addressTO和addressTO1。 这是一个问题,因为这会导致如下错误:

Fehler 1 Eine implizite Konvertierung vom Typ "acsysteme.i4workspace.client.webservices.addressTO1[]" in "acsysteme.i4workspace.client.webservices.addressTO[]" ist nicht möglich. [...] 

这意味着无法隐式转换为类型。 AddressTo类似于核心类,可供其他Web服务使用。

C#-client的Web引用由命令创建

  wsdl.exe /parameters:CreateWebService.xml 

xml文件包含我的webservices的differend .wsdl文件的URL。

有人知道如何处理这个问题吗?

调用/sharetypes时使用/sharetypes选项:

/ sharetypes打开类型共享function。 此function为不同服务之间共享的相同类型创建一个具有单一类型定义的代码文件(名称空间,名称和电线签名必须相同)。 使用http:// URL作为命令行参数引用服务,或为本地文件创建discomap文档。

如果类完全匹配,则只有在单个命令中为两个服务生成代码时才应生成一次。 这两个服务都将使用相同的类,因此不需要进行任何转换。

编辑:

如果XML命名空间不匹配(这是常见的),.NET会认为它们是不同的类型,这是正确的。 您将需要修复Web服务以使类型完全相同(推荐),或者在两个生成的类型之间进行转换。 这将导致很多无聊的属性赋值代码,因此您可能需要考虑使用类似AutoMapper的东西来为您处理转换。

wsdl.exe应生成部分类 ,因此如果需要,可以在不同类型之间定义隐式转换 :

 public static implicit operator addressTO1(addressTO source) { addressTO1 result = new addressTO1(); // Assign properties, etc. return result; } 

我自己通常不是隐含转换的忠实粉丝,但在这种情况下,它可能是有道理的。

我解决了!

我按照Thorarin的提示使用sharetypes选项的sharetypes 。 但是使用这个选项并不是理所当然的。 首先,您需要使用以下注释在Java服务器的Webservice类中设置正确的命名空间(使用URI):

 @WebService(targetNamespace="http://com/project/client/webservices/") public class WebServiceImplementation implements WebService{ // ... your @WebMethod-methods } 

其次,您需要相应地修改createWebService.xml的设置:需要像下面这样添加webservice的命名空间:

   CS true com.project.client.webservices  soap/WebServices.cs BaseUrl http://localhost:8080   http://localhost:8080/Core?wsdl http://localhost:8080/WebService0?wsdl http://localhost:8080/WebService1?wsdl   

而已! 调用wsdl.exe /parameters:createWebService.xml ,你就完成了。

谢谢你的帮助!