使用.Net消费Web服务:两个不同服务中的相同类型

6

我需要使用两个不同的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编写的。
谢谢!
编辑:
这个论坛线程非常接近一个答案,但被接受的答案最终是共享来自客户端和服务器的类型 - 我不能这样做,因为我们正在跨平台(Java到.Net)。真正的问题是,WCF中是否有/sharetypes类型的svcutil参数?

这会对Java产生什么影响?WSDL工具生成的是C#代码。 - leppie
我之所以添加该服务平台是Java,是因为我得到的第一个答案建议在客户端和服务器之间共享.NET类型。 - Steve Horn
5个回答

3
我最终找到的解决方法是向 svcutil.exe 提供我需要从中生成代码的所有 WSDL 地址。SVCUTIL 将查看每个服务中的所有类型,并自动确定哪些类型是常见的并应该被重用。
您想要共享的类型也应具有共享命名空间,并且该命名空间应在希望共享该类型的每个 Web 服务上进行调用。

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指向文件,则无法使用该开关。


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.

1

在使用来自同一提供商的不同端点的Web服务时,这是一种常见情况。

您可以使用"wsdl.exe /sharetypes"命令行工具创建一个共享代理类,该代理类将查看您提供的所有端点,并推断哪些类可以“共享”。

在您的示例中,只要您的用户对象在两个服务中都相同,它就会被捕获并包含在新的共享代理类中。

将此共享代理类生成步骤作为构建事件添加到项目中可能是有意义的,这样它始终是最新的。


0

您可以将用户类型放在一个共享的公共程序集中,该程序集被服务和客户端项目引用。然后,在两个服务客户端的配置中,您可以选择重用引用程序集中的类型选项。这样,您就是在使用程序集中的类型而不是单独生成的类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接