我必须使用2种不同的Web服务。两者都包含“用户”对象的定义。
当我使用“添加服务引用”引用服务时,我为每个服务提供了一个唯一的命名空间:
com.xyz.appname.ui.usbo.UserManagement
com.xyz.appname.ui.usbo.AgencyManagement
我遇到的问题是生成的每个代理都包含一个新的用户类。一个位于com.xyz.appname.ui.usbo.UserManagement.user,另一个位于com.xyz.appname.ui.usbo.AgencyManagement.user。但是,用户对象是相同的,我想这样对待它们。
有没有办法可以某种方式将用户对象作为一个对象引用而不是将它们视为两个不同的对象?
我正在使用.Net 3.5来使用该服务。正在使用的服务是用Java编写的。
谢谢!
编辑:
This forum thread非常接近答案,但接受的答案最终是从客户端和服务器共享类型 - 我不能做,因为我们正在跨越平台(Java到.Net)。真正的问题是,WCF中的svcutil是否有/ sharetypes类型的参数?
答案 0 :(得分:3)
最终为我工作的是为svcutil.exe提供生成代码所需的所有WSDL地址。 SVCUTIL将查看每个服务的所有类型,并自动确定哪些类型是常见的,应该重复使用。
您希望共享的类型也应该具有共享命名空间,并且应该在每个要共享该类型的Web服务上调用该命名空间。
答案 1 :(得分:2)
WSDL工具有一个参数。
/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.
答案 2 :(得分:2)
如果您正在使用本地文件,则可以执行以下操作:
wsdl.exe /sharetypes file://c:\path\to\file.wsdl file://c:\path\to\otherFile.wsdl /namespace:<your namespace> /output:(any switches etc...)
sharetypes开关要求您提供服务的URL,如果只是将wsdl指向文件,则无效。
答案 3 :(得分:1)
当使用来自同一提供商的不同端点的Web服务时,这是一种常见情况。
您可以使用“wsdl.exe / sharetypes”命令行工具创建一个共享代理类,该类将查看您提供的所有端点,并推断哪些类可以“共享”。
在您的示例中,只要您的用户对象在两个服务中都相同,它就会被选中并包含在您的新共享代理类中。
将此共享代理类生成步骤添加为项目中的构建事件可能是有意义的,因为它始终是最新的。
答案 4 :(得分:0)
您可以将用户类型放在服务和客户端项目引用的共享公共程序集中。然后,在两个服务客户端的配置中,您可以选择在引用的程序集中重用类型的选项。这样,你在asssembly而不是单独生成的类中使用了类型。