【问题标题】:Consuming a per session WCF service in a WPF application在 WPF 应用程序中使用每个会话 WCF 服务
【发布时间】:2012-07-30 15:39:14
【问题描述】:

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

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: wpf multithreading wcf caliburn.micro coroutine


    【解决方案1】:

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

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

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

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

    希望这会有所帮助。

    【讨论】:

    • 是的,该服务在每个会话实例中使用开箱即用的服务。我不确定的是本次会议何时开始,何时结束。您提到了那些 IsInitiating 和 IsTerminating 属性,我将对其进行研究。所以我最初可以创建会话,但如果我创建客户端的新实例,我如何告诉它拦截该特定会话。
    • WCF 中的会话的行为不像 ASP.NET,因为没有像 HttpContext.Current.Session 这样的全局 API。您需要保留您的 WCF 代理,但我知道它一旦出现故障就会丢失。我在 WCF 代理中保存和恢复状态的最接近方法是通过持久服务。如果您有兴趣,This 博文将为您提供更多详细信息。
    • 嗯,持久服务似乎会持续服务,但我不在乎。我只希望服务对象的实例即使 clientProxy 死了并且新的 clientproxy 应该能够连接到它也能保持活动状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 2012-03-16
    • 2013-06-02
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多