我目前在我的WPF应用程序中有许多ViewModel需要来自WCF服务的数据。目前,每个ViewModel都存储对(不同)serviceproxy的引用。问题是,在应用程序退出时,WCF未正常关闭(服务器报告意外关闭连接),如果用户长时间处于空闲状态,则连接超时。
我在考虑在我的应用程序中使用WCF的两种不同方法:
在ViewModel中创建serviceproxy并访问Using()语句中的数据,以便我只保持连接短时间打开。
使用所有ViewModel可以为每次调用访问的WCF单例。
(1)的问题是我调用了WCF for CanExecute方法来确定我的GUI上是否启用了按钮。我担心制作这么多代理会变得昂贵而且速度慢。
我看到的问题(2)是我已经注意到的问题:如果WCF连接长时间处于空闲状态,它会超时并且代理出现故障。这意味着更多的错误处理。
如果有人对这种数据访问有良好的模式,我会很感激。
编辑:我知道使用WCF对CanExcute来说是一个坏主意。如果它导致问题,我会改变它,但现在这个应用程序有3个用户。我只是在寻找一种从我的ViewModel中访问服务的好方法,它可以防止断开连接并且也是可测试的。
答案 0 :(得分:1)
从CanExecute代码执行阻塞调用(如WCF调用)是不好的做法。这些调用正在运行时,您的UI被阻止。并且CanExecute被调用太多次了,所以你的服务器也会遇到性能问题......
您需要的是服务器向CanExecutes已更改的客户端发出信号的方式。例如:当一个客户端删除客户时,服务器可以引发其他客户可以订阅的“客户已删除”事件,如果他们的屏幕上有该特定客户,则禁用其“编辑”按钮。
在网上搜索发布/订阅以获取实现该模式的帮助。 您可以从IDesign.net网站下载使用WCF的“发布订阅框架”:http://www.idesign.net/Downloads/GetDownload/2032
答案 1 :(得分:0)