我用 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/