Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WCF的不同实例上共享数据状态_C#_Asp.net_.net_Wcf - Fatal编程技术网

C# 在WCF的不同实例上共享数据状态

C# 在WCF的不同实例上共享数据状态,c#,asp.net,.net,wcf,C#,Asp.net,.net,Wcf,我有两台带有WCF服务的服务器(以后可能还会有更多),都在负载平衡器后面。在多个IS服务器(也是负载平衡的)中,客户机应用程序调用WCF执行一些操作,比如保存。 同样的数据,比如说客户信息,可以由多个用户同时打开。 然后,可以同时从多个用户执行Save操作,调用将转到不同的WCF服务器 我希望当一个用户从UI调用Save时,在同一个客户端数据上已经有另一个UI的保存在进行中,然后向第二个用户发出警报。 为此,所有WCF实例都应该知道在其他实例中执行的操作 那么,如何在所有WCF服务器实例之间同步

我有两台带有WCF服务的服务器(以后可能还会有更多),都在负载平衡器后面。在多个IS服务器(也是负载平衡的)中,客户机应用程序调用WCF执行一些操作,比如保存。 同样的数据,比如说客户信息,可以由多个用户同时打开。 然后,可以同时从多个用户执行Save操作,调用将转到不同的WCF服务器

我希望当一个用户从UI调用Save时,在同一个客户端数据上已经有另一个UI的保存在进行中,然后向第二个用户发出警报。 为此,所有WCF实例都应该知道在其他实例中执行的操作

那么,如何在所有WCF服务器实例之间同步数据状态? 我不想共享数据,只想共享数据的某些状态(已打开、正在保存,诸如此类)

请大家多多指教,谢谢

我在用c#/.NET4


添加:WCF实际上托管在windows服务中。

您遇到的问题是资源管理

您正在尝试解决一种方法,让您的服务客户机以某种方式都知道彼此在服务内部状态上的开放句柄,然后强制他们协调以处理此问题

从长远来看,将这一责任推到客户身上会使事情变得更加复杂。理想情况下,客户应该能够以尽可能直接的方式调用您的服务,而不必知道可能正在使用该服务的任何其他客户。如果呼叫不成功,大多数客户端都应该重试

通常情况下,您可以通过使用锁定来处理这些情况-客户端可以同时提交所有更改,并且除了一个之外,其他所有客户端都必须根据引发的异常或发送回的特定响应(可能包括更新的ClientInformation对象)重试,具体取决于您如何处理它

如果您必须实现这种通知功能,那么您可以考虑使用WCF,您的服务将公开一个回调契约,该契约允许客户端注册一个通知处理程序,该处理程序可用于向发出请求的不同通道上的所有客户端发送通知。然而,这些设置最多是复杂的,并且不能很好地扩展

编辑

作为对您评论的回应,您问题的另一半是关于在负载平衡的服务端点之间共享状态

负载平衡wcf就像负载平衡网站——如果您需要在它们之间共享状态,您必须配置一些所有服务都可以访问的备份数据存储


在您的例子中,最明显的地方是数据库。您只需要确保在您的服务代码中捕获并处理与并发/死锁相关的问题(使用类似NHibernate的东西来持久化数据会有帮助)。我看不出您在这里有什么真正的问题。

您能发布代码示例吗?这个问题有点过于宽泛,问题的一部分,如确保只保存一次,可以使用异步进程解决,可能使用命令模式和消息总线。我认为代码示例在这里并不重要,问题更多的是要设置的体系结构。消息总线已经讨论过,似乎其他团队成员更愿意避免中间件层,我们正在寻找其他可能的方法。您可以使用某种集中锁定系统和类似Signal的东西来提醒其他查看者正在更改/保存相同的数据。Signal已经作为通知机制讨论过。但在同步部分中仍然不清楚。您可能需要为该部分提供一些代码示例或更多信息。我不确定是否有足够的数据可以继续,因为默认情况下WCF服务应该是无状态的。这对于客户端服务更新来说是可以的。但是服务更新呢?我看不出不同的wcf实例如何在您的答案中通信和更新状态。请让我知道