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

时间:2012-07-30 15:39:15

标签: wpf multithreading wcf caliburn.micro coroutine

我不太确定如何以良好的代码方式处理我所拥有的场景。

我工作标准的基本原则是:

  • 使用WCF服务的WPF应用程序
  • 该服务使用每个会话实例化
  • 会话在应用程序启动后很快启动,并且应该在应用程序生存期内生效(除了少量例外)
  • 会话中的某些方法调用必须先于并在完成其他调用之前完成

这意味着我必须能够在整个应用程序中拥有一个代理客户端实例。我还必须能够处理异步调用,因此客户端不会挂断,但同时确保它们已完成。

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

  • 会话何时开始以及何时结束。它是基于客户端的创建还是单独的客户端实例访问同一会话,如果第一个会出现故障。
  • 通过WCF服务处理异常的最佳方法是什么
  • 我应该看一下ChannelFactory,以帮助我放在这里。

所以我在第一次迭代中尝试解​​决其中一些问题。

  • 我使用依赖注入在我的WPF应用程序的各个类中注入客户端实例(我正在使用MVVM)以确保相同的实例无处不在。
  • 我使用异步生成方法创建了服务引用,以获取所有方法的Begin和End版本,以确保调用是异步的
  • 我使用了Caliburn.Micro框架的Coroutine(IResult接口)功能,以确保在另一个开始之前完成一个异步操作(不知道这是正确的用法还是完全是智能移动)。

我仍然遇到的问题当然是如何处理客户端的故障状态。我现在假设我可以重新安装客户端并拯救会话,或者我实际上可以将其重新设置为原样。我现在需要在每次使用相同的新实例注入它时重新安装它。

所以我可能最好创建一个包装客户端的ClientManager类。这样我就可以注入这个ClientManager并在需要时重新安装在他内部。我想我应该让他向外暴露,以便能够进行方法调用,但如果我能以某种方式错误地处理他内部会很好。我只是很难测试我的方法,我不确定它是否能在集成中正常工作,因为我不了解WCF,协同程序和线程的所有内部工作原理。

有没有人在这些事情上有更多的经验,可以给我一些指示或者至少告诉我WCF在这些情况下(每次会话)如何工作以及我做错了什么以及什么是正确的。< / p>

1 个答案:

答案 0 :(得分:1)

WCF支持开箱即用的会话,因此我建议从this MSDN文章开始。

在非常高的级别,首先要在SessionMode=SessionMode.Required中设置ServiceContract。然后,在OperationContract上设置IsInitiating=TrueIsTerminating=True属性,以标记每个会话的开始和结束。

但请注意,WCF默认将并发会话限制为16以阻止DOS attacks,但您始终可以将该值上调。此外,只要主机(IIS / Windows服务/其他)不被回收,您就会意识到会话是有效的。

在相关的说明中,我之前使用过WCF Durable Services - 这意味着在数据存储中保留WCF服务的状态(默认为SQL Server)。当然,这里有一个表现。建议阅读further以确定这是否适合您。

希望这有帮助。