【发布时间】:2013-10-03 16:16:03
【问题描述】:
我正在为我正在进行的项目使用 WCF 和 SignalR 的组合。
WCF 服务有许多 DTO,因为它们是 [OperationContract] 的一部分(作为参数或返回类型)。
但是,我有两个类(MachineStatusDto 和 DeviceStatusDto)仅用作通过 SignalR 从服务器广播的返回类型:
machine.On<MachineStatusDto>("Update", m => UpdateMachineRecord(m)); //On client side
我显然可以在我的 WCF 服务上创建一个使用这些类型的方法,但我觉得应该有一种方法可以通知 WCF 服务包含特定类型,即使它们不是 [OperationContract] 的一部分。
编辑:
最后,如果您只是将[ServiceKnownType(typeof(SomeDto))] 添加到您的 WCF ServiceContract 接口,它会知道发送那些除了服务合同中明确使用的类之外的类。就这么简单。
【问题讨论】:
-
通常我只是将这些类分离到一个单独的共享“域”项目中,这样所有项目都具有相同的类视图,而不是 wcf 服务引用的视图。
-
这些类已经全部位于服务解决方案中的一个共享“域”项目中(如果我导入了一个 DLL 而不是使用服务引用,那么这些类就会存在)。当我可以更新服务引用时,我只是想避免传递 DLL。
-
根据我的经验,您必须将其附加到 [OperationContract] 才能使其显示在您的客户端。我尝试了多种解决方法,但最终这就是我一直在做的事情。
-
在我看来,我宁愿将我的类型放在 dll 中,也不愿依赖它们通过服务引用可用。这样,当您更改 DTO 中的任何内容时,您永远不需要更新服务引用,并且您拥有对象外观的一个来源,而不是两个来源。
-
WCF 允许数据契约版本控制来解决这个问题,我认为更新服务引用比传递特定版本的 DLL 更不容易出错,尤其是当多个团队涉及他们自己的单独的应用程序。我想这只是 SignalR 在胖应用中的缺点之一
标签: c# wcf serialization signalr