【问题标题】:Generating Occasionally Disconnected WPF App生成偶尔断开连接的 WPF 应用程序
【发布时间】:2014-12-02 19:42:24
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    要完成这项工作,请创建一个可序列化的类或满足您的客户端字段要求的类。这些类需要实现 INotifyPropertyChanged,以便您可以将 UI 字段绑定到它并将更改保存在模型对象内部(与 UI 控件本身相反)。你后面的代码也需要实现 INotifyPropertyChanged。您需要一个保存数据对象实例的属性,这就是您将字段绑定到的对象。

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

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

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

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

    【讨论】:

    • 很棒的帖子... WPF 应用程序正在实现 INotifyPropertyChanged。 WCF 应用程序也使用实体框架,因此为了避免使用本地数据库,我将不得不将它带到我的小组中,并让他们考虑将对象序列化为文件并稍后反序列化它。昨天我脑子里突然出现了一些事情,您对使用 MSMQ 有什么想法?
    • 我从未使用过它,但它已包含在 WCF 中,所以如果它符合您的需求,那就去吧。
    猜你喜欢
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多