c# - Webreferences 共享类

标签 c# web-services soap webservice-client

我用 Java 编写了一些 SOAP Web 服务,运行在 JBoss 5.1 上。 其中两个共享一个类,AddressTO。 Web 服务在我的 ApplycationServer 上正确部署并且一切顺利,直到我尝试在我的 C# 客户端中使用类 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.   
    [...]

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

C# 客户端的 webreferences 由命令创建

    wsdl.exe /parameters:CreateWebService.xml

xml 文件包含指向我的网络服务的不同 .wsdl 文件的 url。

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

最佳答案

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

/sharetypes Turns on type sharing feature. This feature creates one code file with a single type definition for identical types shared between different services (namespace, name and wire signature must be identical). Reference the services with http:// URLs as command-line parameters or create a discomap document for local files.

如果类完全匹配,如果您在一个命令中为两个服务生成代码,则它们应该只生成一次。两种服务将使用相同的类,因此无需转换。

编辑:

如果 XML namespace 不匹配(这种情况很常见),.NET 会将它们视为不同的类型,这是正确的。您要么必须修复 Web 服务以使类型完全相同(推荐),要么在两种生成的类型之间进行转换。这将导致大量无聊的属性分配代码,因此您可能需要考虑使用类似 AutoMapper 的代码。为您处理转换。

wsdl.exe 应该生成 partial classes ,所以如果你愿意,你可以定义隐式 conversions不同类型之间:

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

我自己通常不是隐式转换的忠实拥护者,但在这种情况下可能有必要。

关于c# - Webreferences 共享类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6029300/

相关文章:

c# - 如何从 C# 中的 Powershell 管道读取错误?

c# - Azure 免费订阅上消费托管函数的性能

java - 从 .Net 调用 Java Web 服务

java - 如何将自定义 SOAP-Header 元素添加到 Spring-WS 中生成的 WSDL

c# - 在 C# 中捕获 cookie 响应

c# - 必须设置属性 "sonar.cs.fxcop.assembly"并且项目必须已经构建

JAVA-EE7/javax.ws.rs : Injection of EJB in REST-Resource

java - Apache 服务器上的第一个 REST 调用速度缓慢

php - SoapClient 设置自定义 HTTP header

soap - IntelliJ 不会使用 Apache Axis 2 从 Java 代码生成 WSDL