如何确保客户端在WPV MVVM应用程序中保持与WCF服务的连接?

时间:2012-07-10 23:18:13

标签: wpf wcf mvvm client

我有一个WPF应用程序,有一个'登录'窗口,用户需要在其中指定用户名和密码。然后,WPF应用程序需要使用这些凭据连接到WCF服务,并在其生命周期内保持与服务的连接,因为它通过ICallback接口接收来自服务的回调通知。

这是一个想法(link to larger image):

This is the idea: http://s14.postimage.org/r2gbc9uvz/SO_Question_2.png

问题:

  1. 凭据(用户名和密码)信息是否应通过Login ViewModel提供给静态服务工厂?

  2. 服务客户端设法连接到WCF服务后,应该关闭“登录”窗口,并显示MainWindow。主窗口现在如何知道Login窗口创建的服务客户端?一旦从服务到达,MainWindow将如何显示通知?

  3. 登录窗口是否应该将服务客户端传递给MainWindow?这对我来说似乎很糟糕......

  4. 假设WCF服务由于某种原因而关闭。我希望MainWindow能够显示它(可能使用红色的led图像)。如何将有关断开连接的信息从服务工厂传递到主窗口的视图?视图是否应该挂钩客户端中的事件?

  5. 如何继续执行自动重新连接'如果它断开连接(也许是因为维护而被取消)到WCF服务?

  6. 任何能够回答任何问题的人都会对我有所帮助......

2 个答案:

答案 0 :(得分:1)

创建一个新的WCF API调用,它是一个'听众'。客户端必须每隔5分钟调用一次此调用,如果不是,则客户端已断开连接。

强制客户端发送断开连接消息是有问题的。请记住,由于硬件问题(例如连接丢失或其他故障),客户端计算机可能随时崩溃。

答案 1 :(得分:1)

  1. 将Login服务抽象为ILoginService接口(更容易进行模拟)。实现您认为最好的部署代码(例如服务工厂)。 LoginService将实现登录功能(例如auth)。

  2. 您使用的是哪个MVVM工具包? (我建议尝试使用MVVM Light。)

  3. 是。登录只是一个子弹出/对话框。您可以在共享的LoginService中尝试MEFing,或者假设MVVM Light,您可以使用Messenger。

  4. MainkeyModel应该像Mikey建议的那样进行心跳。当出现错误时,设置一个INotifyPropertyChanged(INPC)属性(MainWindow绑定到该属性)。

  5. 这似乎是个人喜好。它是否应该尝试在5秒内重新连接,然后是30秒,然后是2分钟,然后是5分钟,然后是1小时?我不知道;只要你觉得这样做。尝试一些不同的东西。我没有预见到使用相同的线程重新连接会造成伤害。