C# Webreferences共享类

C# Webreferences共享类,c#,web-services,soap,webservice-client,C#,Web Services,Soap,Webservice Client,我用Java编写了一些SOAP Web服务,运行在JBoss 5.1上。 其中两人共享一个类,AddressTO。Webservices在我的ApplycationServer上正确部署,在我尝试在C#client中使用addressTO类之前,一切都很顺利。客户端应用程序中有两种类型,addressTO和addressTO1。这是一个问题,因为这会导致以下错误: Fehler 1 Eine implizite Konvertierung vom Typ "acsyste

我用Java编写了一些SOAP Web服务,运行在JBoss 5.1上。 其中两人共享一个类,AddressTO。Webservices在我的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#-客户端的webreferences由命令创建

    wsdl.exe /parameters:CreateWebService.xml
xml文件包含指向我的Web服务的different.wsdl文件的URL


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

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

/股票类型 打开类型共享功能。此功能创建一个代码文件 具有 一个单一的类型定义,用于在 不同的 服务(名称空间、名称和连接签名必须相同)。 使用http://url作为命令行引用服务 参数 或为本地文件创建discomap文档

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

编辑:

如果XML命名空间不匹配(这是常见的事件),.NET会认为它们是不同的类型,并且正确。您要么修复web服务,使其类型完全相同(推荐),要么在两个生成的类型之间进行转换。这将导致大量乏味的属性分配代码,因此您可能需要考虑使用一些类似的方法来处理转换。

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

public static implicit operator addressTO1(addressTO source)
{
    addressTO1 result = new addressTO1();
    // Assign properties, etc.
    return result;
}
我自己通常不太喜欢隐式转换,但在这种情况下,这可能是有道理的。

我解决了它

我按照Thorarin的提示使用
wsdl.exe
选项
sharetypes
。但是,使用这个选项并不是一件难事。首先,您需要使用以下注释在java服务器的Webservice类中设置正确的命名空间(使用URI):

@WebService(targetNamespace="http://com/project/client/webservices/")
public class WebServiceImplementation implements WebService{
      // ... your @WebMethod-methods
}
其次,您需要相应地修改
createWebService.xml
中的设置:需要像这样添加webservice的命名空间:

<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>

反恐精英
真的
com.project.client.webservices
soap/WebServices.cs
基本URL
http://localhost:8080 
http://localhost:8080/Core?wsdl       
http://localhost:8080/WebService0?wsdl    
http://localhost:8080/WebService1?wsdl 
就这样!调用
wsdl.exe/parameters:createWebService.xml
就完成了


谢谢你的帮助

嘿,谢谢你的快速回复,但是/shared-types在createwebservice.xml
CS-true-acsysteme.i4workspace.client.webservices
中打开了allready,似乎名称空间不相等。@the_-mario:我已经用一些建议更新了我的答案。最好是让XML名称空间匹配:)好的,重写强制转换的好提示,但是来自webservice的类是由wsdl.exe生成的。因此,将没有办法插入我自己的代码铸造。xml文件中wsdl.exe的设置是:请参阅下一条注释
CS true client.webservices soap/webservices.CS BaseUrlhttp://localhost:8080 	 	 	 		http://localhost:8080/Core?wsdl 		http://localhost:8080/Service1?wsdl 		http://localhost:8080/Service2?wsdl 		 
@the_mario:您可以在生成的文件旁边的单独文件。这就是部分类的用途,这就是我提到它们的原因。很好,您成功地修复了名称空间,但是,这是首选的解决方案:)好的,这是我一开始不理解的:D谢谢!