【问题标题】:How to make sure client stays connected to WCF service in WPV MVVM app?如何确保客户端保持连接到 WPV MVVM 应用程序中的 WCF 服务?
【发布时间】:2012-07-10 23:18:13
【问题描述】:

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

这就是想法(link to larger image):

问题:

  1. 是否应通过登录视图模型将凭据(用户名和密码)信息提供给静态服务工厂?

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

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

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

  5. 如果 WCF 服务断开连接(可能因维护而停机),如何继续对 WCF 服务执行“自动重新连接”?

任何能回答任何问题的人都会对我有很大帮助......

【问题讨论】:

    标签: wpf wcf mvvm client


    【解决方案1】:

    创建一个新的 WCF API 调用,它是一个“心跳”。客户端必须每 5 分钟左右调用一次此调用,如果不是,则客户端已断开连接。

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

    【讨论】:

    • 我不太明白这对我的问题有何帮助。对不起:\
    【解决方案2】:
    1. 将登录服务抽象为 ILoginService 接口(更易于模拟)。以您认为最好的方式实施部署代码(例如服务工厂)。 LoginService 将实现登录功能(例如 auth)。

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

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

    4. MainViewModel 应该按照 Mikey 的建议进行心跳。出现错误时,设置 INotifyPropertyChanged (INPC) 属性(MainWindow 绑定到的)。

    5. 这似乎是个人喜好。它应该尝试在 5 秒、30 秒、2 分钟、5 分钟、1 小时内重新连接吗?我不知道;随心所欲地去做。尝试一些不同的东西。我认为使用同一个线程重新连接不会有什么害处。

    【讨论】:

    • 2.我考虑过使用“简单 MVVM 工具包”,即使它使用“服务定位器”,我理解这是一种反模式......
    • 3. 'LoginViewModel' 如何将服务传递给 'MainWindowViewModel' ?这不是糟糕的编码吗?
    • 5.我的意思是——一旦检测到断开连接(使用心跳)——执行心跳的线程应该是执行重新连接的线程吗?
    • 在 7 月 11 日 5:46 发表评论后 10 分钟内更新。见revisions
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多