19

我正在构建一组共享通用数据合同(或实体,如果您愿意)的 WCF 服务。这些是用 DataContract 和 DataMember 属性修饰的简单数据传输对象。我明确指定了名称和命名空间。在尝试遵循 IDesign 建议的每个服务合同平均 12 名成员的原则时,我将我的服务项目分解为多个服务。

我的数据合同在一个单独的程序集中,如果他们使用 .Net,我可以将其提供给我们的客户。他们可以告诉他们的服务引用在引用的程序集中重用类型。但是,如果他们不使用 .net 并且他们使用 2 个服务,这两个服务都使用相同的实体,那么我假设他们会得到一个模棱两可的参考消息。如果我不引用数据合同 dll,我可以在 Visual Studio 中看到这一点。

我的问题是,我可以在我的服务中做些什么,或者他们可以在客户端应用程序中做些什么来绕过必须限定数据合同来自哪个代理?

4

6 回答 6

11

很好的文章,描述了如何解决这个问题。 在 WCF 服务之间共享 DataContract

于 2010-08-28T07:11:49.257 回答
2

我还倾向于将我的所有数据合同保存在一个程序集中,该程序集被多个服务和众多客户端应用程序引用,这很好用,但我从未尝试在 .NET 之外使用该服务。

了解他们使用什么技术来使用除 .NET 之外的服务可能会有所帮助?什么是抛出模棱两可的参考信息?

于 2010-02-24T15:54:43.867 回答
0

这取决于他们在客户端使用的工具。例如,对于 Axis2 for Java,wsdl2java 工具可以通过使用 -u 开关来共享类型。

如何在多个 Axis2 Web 服务客户端之间共享代理对象?

于 2010-02-26T14:23:07.107 回答
0

根据我的理解和使用 WCF 的情况,只要完全限定名称相同并且具有相同的数据成员,客户端应用程序使用的任一数据协定都无关紧要。在内部,它只是动态创建对象并使用公共设置器重新分配这些数据成员属性。

我认为一种更好的方法是重构您的数据合同,以便您将多个服务中的所有共同点放入一个程序集中并引用它们,因此无论客户端使用多少服务,您都不会遇到这种模棱两可或冲突的问题应用程序。

于 2010-02-26T14:29:42.403 回答
0

我碰巧有多个共享对象的服务。我不确定你为什么会遇到这个问题。就我而言,我能够以这种方式访问​​对象。. . .

SERVICE1 客户端 = 新 SERVICE1()

客户端.CommonLibrary.地址。. .

SERVICE2 客户端 2 = 新 SERVICE2()

client2.CommonLibrary.Address 。. . .

于 2010-02-24T17:59:44.173 回答
0

我们不是通过 Visual Studio 助手生成服务代理,而是通过调用 slsvcutil.exe 的自定义批处理文件(因为我们使用 Silverlight)。在那里,您可以使用 /n 参数指定命名空间映射,如下所示:

"C:\Program Files (x86)\Microsoft SDKs\Silverlight\v5.0\tools\slsvcutil.exe "^
 http://ServiceUrl/MyService.svc^
 **/n:http://youruri.org/CustomerService/DataContracts,CLR.Namespace.CustomerService^**
 /n:*,CLR.Namepsace.MyService^
 /r:"%ProgramFilesFolder%\Reference Assemblies\Microsoft\Framework\Silverlight\v5.0\System.Windows.dll"^
 /ct:System.Collections.ObjectModel.ObservableCollection`1^
 /edb^

因此,所有具有命名空间的数据协定都会http://youruri.org/CustomerService/DataContracts生成到代理文件中的 clr 命名空间 CLR.Namespace.CustomerService 等等。鉴于您已经在同一个代理程序集中预先生成了此代理,您可以从第二个文件中删除整个命名空间,一切正常 - 我们为最后一步编写了一个小工具。所有其他合约命名空间都将生成到 CLR.Namepsace.MyService 命名空间(请参阅星号的含义)

该过程设置起来有些麻烦,因为您必须手工制作批处理文件,但是一旦完成,它就会运行良好。

于 2012-05-30T06:25:02.253 回答