2

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

我工作的基本标准是这样的:

  • 使用 WCF 服务的 WPF 应用程序
  • 该服务使用每个会话实例
  • 会话在应用程序启动后立即开始,并且应该在应用程序生命周期内存在(有小例外)
  • 会话中的某些方法调用必须先于并在调用其他方法之前完成

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

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

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

所以我在第一次迭代中做了什么来尝试解决其中的一些问题。

  • 我使用依赖注入在我的 WPF 应用程序的整个类中注入客户端实例(我正在使用 MVVM),以确保相同的实例无处不在。
  • 我使用异步生成方法进行服务引用以获取所有方法的 Begin 和 End 版本,以确保调用是异步的
  • 我使用了 Caliburn.Micro 框架的协程(IResult 接口)特性来确保一个异步操作在另一个异步操作开始之前完成(不知道这是否是正确的使用,或者它是否是一个聪明的举动)。

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

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

有没有人在这些问题上比我更有经验,可以给我一些指示,或者至少告诉我 WCF 在这些情况下是如何工作的(每个会话)以及我做错了什么,什么是对的。

4

1 回答 1

1

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

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

但是请注意,WCF 默认将并发会话限制为16以防止DOS 攻击,但您始终可以提高该值。此外,您会意识到会话是有效的,只要它的主机(IIS / Windows 服务 / 其他)没有被回收。

在相关的说明中,我之前使用过WCF 持久服务- 它旨在将 WCF 服务的状态持久保存在数据存储中(默认为 SQL Server)。当然,这里有一个性能打击。建议进一步阅读,看看这是否适合您。

希望这可以帮助。

于 2012-07-30T16:42:29.480 回答