在WPF应用程序中使用每会话WCF服务
我不确定如何以良好的代码方式处理我的场景 我工作的基本标准是:在WPF应用程序中使用每会话WCF服务,wpf,multithreading,wcf,caliburn.micro,coroutine,Wpf,Multithreading,Wcf,Caliburn.micro,Coroutine,我不确定如何以良好的代码方式处理我的场景 我工作的基本标准是: 使用WCF服务的WPF应用程序 该服务使用每个会话实例 该会话在应用程序启动后不久启动,并应在应用程序的整个生命周期内运行(有小的例外) 会话中的某些方法调用必须在调用其他方法之前进行并完成 这意味着我必须能够在整个应用程序中拥有一个代理客户端实例。我还必须能够处理异步调用,这样客户端就不会挂断,但同时确保它们完成 我对go WCF的技术理解是有限的,不知道某些场景是否能按预期工作。所以我要列出我的不确定性: 会话何时开始,何
- 使用WCF服务的WPF应用程序
- 该服务使用每个会话实例
- 该会话在应用程序启动后不久启动,并应在应用程序的整个生命周期内运行(有小的例外)
- 会话中的某些方法调用必须在调用其他方法之前进行并完成
- 会话何时开始,何时结束。它是基于客户端的创建,还是如果第一个客户端实例出现故障,那么另一个客户端实例可以访问同一个会话
- 通过WCF服务处理异常的最佳方式是什么
- 这是我应该看的东西来帮我放在这里
- 我使用依赖注入在我的WPF应用程序的所有类中注入客户机实例(我使用的是MVVM),以确保相同的实例无处不在
- 我使用异步生成方法进行服务引用,以获取所有方法的开始和结束版本,以确保调用是异步的
- 我使用Caliburn.Micro框架的协同程序(IResult接口)功能来确保一个异步操作在另一个异步操作开始之前完成(我不知道这是一个正确的用法还是一个聪明的操作)
是否有人在这些问题上比我更有经验,可以给我一些建议,或者至少告诉我WCF在这些情况下是如何工作的(每个会话),我做错了什么,做对了什么。WCF支持开箱即用的会话,所以我建议从MSDN文章开始 在非常高的级别上,首先在
ServiceContract
中设置SessionMode=SessionMode.Required
。然后,在OperationContract上设置IsInitiating=True
和IsTerminating=True
属性,以标记每个会话的开始和结束
但是,请注意,WCF在默认情况下限制并发会话以防止,但您始终可以提高该值。此外,您可能已经意识到,只要会话的主机(IIS/Windows服务/other)不被回收,会话就是有效的
与此相关的一点是,我在前面使用了-这意味着在数据存储中持久化WCF服务的状态(默认为SQL Server)。当然,这里有一个表演热。建议阅读,看看这是否是你的正确选择
希望这有帮助。是的,该服务正在使用开箱即用的会话实例。我不确定的是这个会话什么时候开始,什么时候结束。你提到了那些正在初始化和注册的属性,我将对它们进行研究。因此,我可以最初创建会话,但如果我创建了客户端的新实例,我如何告诉它拦截该特定会话。WCF中的会话的行为与ASP.NET不同,因为没有像HttpContext.Current.session这样的全局API。你需要保留你的WCF代理,但我知道一旦它出现故障就会丢失。我在WCF代理中保存和恢复状态所做的最接近的工作是通过持久服务。如果你感兴趣的话,博客文章会给你更多的细节。嗯,持久服务似乎能持续提供服务,但我不在乎这一点。我只希望服务对象的实例保持活动状态,即使clientProxy死亡,并且新的clientProxy应该能够连接到它。