wcf - 两个 WCF 服务向 silverlight 客户端返回相同的数据契约

标签 wcf silverlight datacontract

我有两个逻辑上不同的 WCF 服务,我希望将它们分开。他们每个人都有一个返回相同数据契约的操作。单个 silverlight 客户端使用这两种服务。当我在 silverlight 客户端中向每个服务添加服务引用时,单个数据契约在生成的代码中出现两次。是否可以让两个服务引用使用相同的数据契约定义?

据我所知,对于非 silverlight 客户端,可以通过将数据契约编译成一个单独的程序集来由服务器和客户端引用。然而,这对于 silverlight 来说是不可能的(至少在 silverlight 3 中)。

谢谢,
罗布

最佳答案

斯蒂安,

感谢您的快速回复。我观看了米格尔·卡斯特罗的截屏视频,内容非常丰富。不幸的是它不包括 silverlight 的情况。然而,以此为起点,我能够得到一些其他人可能会觉得有用的东西。

创建两个程序集:ServerDataContracts 和 SilverlightDataContracts(此为 silverlight 程序集)。在每个人的 AssemblyInfo.cs 中添加以下行:

[assembly: ContractNamespace("http://YourNamespaceUri",
 ClrNamespace = "YourDataContractsNamespace")]

将所有 DataContracts 添加到 ServerDataContracts 程序集中。在 SilverlightDataContracts 程序集中,右键单击项目(或子文件夹)并选择“添加现有项”。浏览到 ServerDataContracts 程序集中的 DataContracts,然后选择要添加的数据契约(Contract)。不要点击“添加”!相反,单击“添加”旁边的向下箭头并选择“添加为链接”。这会将 SilverlightDataContracts 项目链接到 ServerDataContracts 项目中的现有文件。现在,当您编辑一个项目时,两个项目都会发生更改。编译时,项目将以其正确的目标单独编译。

现在添加 ServerDataContracts 程序集作为对服务契约(Contract)项目的引用。对 Silverlight 应用程序的 SilverlightDataContracts 程序集执行相同的操作。当您将 silverlight 客户端中的服务引用添加到您的服务时,它不应生成数据契约。它应该使用您的程序集中的那些。

我已经得到了这个工作,但是它仍然缺少生成的数据契约类提供的一些功能。生成的类实现 INotifyPropertyChanged,这在 silverlight/wpf 中进行数据绑定(bind)时非常有用。虽然您可以自己实现这一点,但这相当乏味,现在您的服务器代码必须对每个属性集执行所有这些事件处理程序,即使您可能永远不会订阅服务器上的 PropertyChanged 事件。

我仍在寻找一种更简洁的方法来处理这个问题。看起来 silverlight 4 将使这变得更容易,因为您可以在客户端和服务器中使用相同的程序集(编译的代码是兼容的)。不幸的是,这对于我的需求来说太远了。

关于wcf - 两个 WCF 服务向 silverlight 客户端返回相同的数据契约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2290875/

相关文章:

silverlight - 无法将 VM 中的 ICommand 绑定(bind)到 xaml 中的按钮命令

C# WCF - 自定义服务器端监控实现

performance - ConnectionManagement.MaxConnections和ServicePointManager.DefaultConnectionLimit有什么区别?

wcf - TCP:客户端在向服务器发送[ACK]后立即发送[RST,ACK]

wcf - 是否可以使用实体作为数据契约?

c# - 将 DataContract 作为 XML 保存在数据库中

c# - C# DataContracts 的表现力是否足以正确描述 GeoJSON?

c# - .NET 的 Oracle 数据提供程序 : Connection request timed out

c# - Silverlight XAML 文件中文本的 TextBlock 换行

silverlight - WP7 - 动画添加/删除列表框中的项目