我用Java编写了一些SOAP Web服务,在JBoss 5.1上运行。 其中两个人共享一个类AddressTO。 Web服务正在我的ApplycationServer上正确部署,一切顺利,直到我尝试在我的C#-client中使用类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。
有人知道如何处理这个问题吗?
答案 0 :(得分:3)
致电/sharetypes
时使用wsdl.exe
选项:
/ sharetypes 打开类型共享功能。此功能创建一个代码文件 同 对于相同类型之间共享的单一类型定义 不同 服务(名称空间,名称和电线签名必须相同)。 使用http:// URL作为命令行引用服务 参数 或者为本地文件创建一个discomap文档。
如果类完全匹配,则只有在单个命令中为两个服务生成代码时才应生成一次。这两个服务都将使用相同的类,因此不需要转换。
如果XML命名空间不匹配(这是常见的),.NET会将它们视为不同的类型,这是正确的。您将需要修复Web服务以使类型完全相同(推荐),或者在两个生成的类型之间进行转换。这将导致很多无聊的属性分配代码,因此您可能需要考虑使用AutoMapper之类的东西来处理转换。
wsdl.exe应生成partial classes,因此如果需要,您可以在不同类型之间定义隐式conversions:
public static implicit operator addressTO1(addressTO source)
{
addressTO1 result = new addressTO1();
// Assign properties, etc.
return result;
}
我自己通常并不是隐含转换的忠实粉丝,但在这种情况下,它可能是有道理的。
答案 1 :(得分:1)
我解决了!
我按照Thorarin的提示使用wsdl.exe
选项sharetypes
。但是使用这个选项并不是理所当然的。首先,您需要使用以下注释在Java服务器的Webservice类中设置正确的命名空间(使用URI):
@WebService(targetNamespace="http://com/project/client/webservices/")
public class WebServiceImplementation implements WebService{
// ... your @WebMethod-methods
}
其次,您需要相应地修改createWebService.xml
中的设置:Web服务的命名空间需要像这样添加:
<wsdlParameters xmlns="http://microsoft.com/webReference/">
<!-- Defaultsettings -->
<language>CS</language>
<sharetypes>true</sharetypes>
<namespace>com.project.client.webservices</namespace>
<!-- output -->
<out>soap/WebServices.cs</out>
<appSettingUrlKey>BaseUrl</appSettingUrlKey>
<appSettingBaseUrl>http://localhost:8080</appSettingBaseUrl>
<!-- web service locations -->
<documents>
<document>http://localhost:8080/Core?wsdl</document>
<document>http://localhost:8080/WebService0?wsdl</document>
<document>http://localhost:8080/WebService1?wsdl</document>
</documents>
</wsdlParameters>
就是这样!致电wsdl.exe /parameters:createWebService.xml
,您就完成了。
感谢您的帮助!