我正在考虑将数据保存在WCF托管服务中的DataSet中,而其他应用程序(在同一个盒子上)可以通过命名管道(通过WCF服务公开)访问数据。然后,应用程序会在其中保留dataSet的副本,以便不会从WCF重新获取数据,除非它被更改。
以datarow集合的形式从服务器检索数据,因此我将其写为DataTables
并将其存储为Dataset
。
数据很少会改变,但是当它发生时,我必须通知所有已检索数据的客户端应用程序。
答案 0 :(得分:0)
您的解决方案可行。如果您可以访问适当的缓存服务,例如ScaleOut StateServer,Velocity或memcached,则可以根据需要使用它。它可以做同样的事情,但是您将获得一个经过验证的解决方案,其中包含有关缓存管理的其他功能,以及在需要时扩展到多台计算机的能力。
答案 1 :(得分:0)
我用我写的应用程序做了类似的事情。
您可以使用回调轻松让服务在数据更改时更新客户端。当客户端连接到服务时,您需要存储他们的回调信息,当数据更新时,您只需将消息发送给每个订阅的客户端。
以下是回调合约:
public interface IServiceMessageCallback
{
[OperationContract(IsOneWay = true)]
void OnReceivedServiceMessage(ServiceMessage serviceMessage);
}
该服务实现此接口。该服务有这个私人领域:
/// <summary>
/// Holds the callback recipients
/// </summary>
private List<IServiceMessageCallback> callbackMessages =
new List<IServiceMessageCallback>();
当客户端连接时,请执行以下操作:
IServiceMessageCallback callback =
OperationContext.Current.GetCallbackChannel<IServiceMessageCallback>();
callbackMessages.Add(callback);
最后,无论你有什么方法更新服务上的数据,都应该有:
Action<IServiceMessageCallback> fire =
delegate(IServiceMessageCallback callback)
{ callback.OnReceivedServiceMessage(serviceMessage); };
// loop thru the callback channels and perform the action
callbackMessages.ForEach(fire);
我把这段代码从我写的一个相当沉重的服务中修补了......希望这些内容在上下文中是有意义的。