网络引用共享类

本文关键字:共享 引用 网络 | 更新日期: 2023-09-27 17:56:45

我用Java编写了一些SOAP Web服务,运行在JBoss 5.1上。其中两个共享一个类,AddressTO。Web服务在我的Applycation服务器上正确部署,并且一切顺利,直到我尝试在我的C#客户端中使用类地址TO。客户端应用程序中有两种类型:addressTO 和 addressTO1。这是一个问题,因为这会导致以下错误:

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

这意味着不可能隐式强制转换为 to 类型。AddressTo类似于核心类,可以被其他Web服务使用。

C# 客户端的 Web 引用由命令创建

    wsdl.exe /parameters:CreateWebService.xml

xml文件包含我的Web服务的不同.wsdl文件的URL。

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

网络引用共享类

调用wsdl.exe时使用/sharetypes选项:

/共享类型 打开类型共享功能。此功能创建一个代码文件 跟 共享的相同类型的单个类型定义 不同 服务(命名空间、名称和线路签名必须相同)。 使用 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;
}

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

我解决了!

我按照索拉林的提示使用wsdl.exe选项sharetypes。但是使用这个选项不是永恒的。首先,您需要使用以下注释在 Java 服务器的 Web 服务类中设置正确的命名空间(使用 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,你就完成了。

感谢您的帮助!