在WPF应用程序中使用每会话WCF服务

在WPF应用程序中使用每会话WCF服务,wpf,multithreading,wcf,caliburn.micro,coroutine,Wpf,Multithreading,Wcf,Caliburn.micro,Coroutine,我不确定如何以良好的代码方式处理我的场景 我工作的基本标准是: 使用WCF服务的WPF应用程序 该服务使用每个会话实例 该会话在应用程序启动后不久启动,并应在应用程序的整个生命周期内运行(有小的例外) 会话中的某些方法调用必须在调用其他方法之前进行并完成 这意味着我必须能够在整个应用程序中拥有一个代理客户端实例。我还必须能够处理异步调用,这样客户端就不会挂断,但同时确保它们完成 我对go WCF的技术理解是有限的,不知道某些场景是否能按预期工作。所以我要列出我的不确定性: 会话何时开始,何

我不确定如何以良好的代码方式处理我的场景

我工作的基本标准是:

  • 使用WCF服务的WPF应用程序
  • 该服务使用每个会话实例
  • 该会话在应用程序启动后不久启动,并应在应用程序的整个生命周期内运行(有小的例外)
  • 会话中的某些方法调用必须在调用其他方法之前进行并完成
这意味着我必须能够在整个应用程序中拥有一个代理客户端实例。我还必须能够处理异步调用,这样客户端就不会挂断,但同时确保它们完成

我对go WCF的技术理解是有限的,不知道某些场景是否能按预期工作。所以我要列出我的不确定性:

  • 会话何时开始,何时结束。它是基于客户端的创建,还是如果第一个客户端实例出现故障,那么另一个客户端实例可以访问同一个会话
  • 通过WCF服务处理异常的最佳方式是什么
  • 这是我应该看的东西来帮我放在这里
所以我在第一次迭代中所做的就是试图解决其中的一些问题

  • 我使用依赖注入在我的WPF应用程序的所有类中注入客户机实例(我使用的是MVVM),以确保相同的实例无处不在
  • 我使用异步生成方法进行服务引用,以获取所有方法的开始和结束版本,以确保调用是异步的
  • 我使用Caliburn.Micro框架的协同程序(IResult接口)功能来确保一个异步操作在另一个异步操作开始之前完成(我不知道这是一个正确的用法还是一个聪明的操作)
当然,我仍然面临的问题是如何处理客户端的故障状态。我现在假设我可以重新启动客户机,或者拯救会话,或者我可以重新设置它。现在,我需要在使用相同的新实例注入它的每个地方重新插入它

所以我认为最好创建一个ClientManager类来包装客户机。这样我就可以在需要的时候给这位客户经理注入新的血液。我想我应该把他暴露出来,让他能够进行方法调用,但如果我能以某种方式处理他内部的错误,那就太好了。我只是很难测试我的方法,而且我从来都不确定它在集成中是否能正常工作,因为我不了解WCF、协程和线程的所有内部工作原理


是否有人在这些问题上比我更有经验,可以给我一些建议,或者至少告诉我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应该能够连接到它。