生成偶尔断开连接的WPF应用程序

时间:2014-12-02 19:42:24

标签: c# wpf web-services wcf offline-caching

希望你能帮助我走上正确的道路。我目前正处于项目的设计阶段。我有一个WCF Soap / Rest Web服务,将由我的WPF客户端应用程序使用。由于WPF应用程序需要在连接状态和断开连接状态下工作,因此我遇到了如何实现缓存的设计问题。

我知道在使用ObjectCache的应用程序运行时缓存,但我想知道如果应用程序被关闭并重新打开,我想检索用户已经输入的任何内容,如果用户断开连接我可以获取最后的Web服务响应并填充表单?由于ObjectCaching仅在应用程序启动时,我认为有一种方法是拥有一个本地数据库,其中客户端应用程序存储来自Web服务响应和用户输入/修改数据的所有数据。我不喜欢这个选项是我必须复制服务器数据库及其表格和数据,我认为这是非常好的做法,也非常安全。

最后,如何同步所有数据?当您最终连接时我需要调用WCF Web服务更新方法并将信息更新回服务器时断开连接。这是一种带有批处理作业的消息传递,它可以在客户端上运行,知道何时连接并重新处理所有数据?任何想法都会很棒。

1 个答案:

答案 0 :(得分:1)

您正在寻找的内容非常容易实现,并且不需要客户端数据库。是否以这种方式实现它实际上取决于您需要数据的安全性。

要以完全断开连接的方式在客户端上保存数据,让用户退出并返回而不会丢失其条目,您唯一的选择是将数据存储在客户端上。如果应用程序无法访问Web服务器以保留更改,并且应用程序关闭或崩溃,则更改将丢失,并且用户不满意。

要使其工作,请创建一个或多个适合您的客户端字段要求的类。这些类需要实现INotifyPropertyChanged,以便您可以将UI字段绑定到它并将更改保留在模型对象内(而不是UI控件本身)。你的代码背后还需要实现INotifyPropertyChanged。您需要一个包含数据对象实例的属性,这就是您将字段绑定到的地址。

当用户键入/进行更改时,您的数据绑定有3个更新选项:当用户离开字段时更新属性,在文本更改时更新属性,或等待更新属性直到指定的延迟时间之后。发生这些更新时,将引发PropertyChanged事件。如果附加到此事件,则可以在类中编写一个方法来序列化它并在输入时保存数据。一个简单的XML或JSON文件就可以了。您还需要添加一个load方法来读取数据文件,对其进行反序列化并返回数据对象。这样,如果应用程序意外关闭或崩溃,您只需调用Load方法并将代码中的属性设置为加载对象,绑定将恢复文本,用户可以继续。

为了使所有内容保持同步,客户端会将对象发送到服务器,以便它可以验证并保存更改。我会使用一个字段来跟踪数据版本(如果使用SQL Server,则为TimeStamp字段),以防止具有过期数据的客户端覆盖较新的数据,特别是如果您处于多用户环境中。

如果您的服务器能够利用WCF和实体框架,您可以非常快速地构建一个非常强大,可靠的应用程序。

就安全性而言,这取决于输入的数据类型及其背后的法律要求(即信用卡和PCI合规性),因此您必须单独解决这些问题。