【问题标题】:WPF Client - Should I make calls to WCF service in background thread?WPF 客户端 - 我应该在后台线程中调用 WCF 服务吗?
【发布时间】:2012-05-12 09:57:12
【问题描述】:

我有一个 WPF 客户端调用 2 个 WCF 服务。

一项服务仅用于查询,一项服务用于命令 (CQS pattern)。

我应该如何调用命令服务?

我在某处读到命令服务中的所有操作都必须是“单向”的, 因为它们不应该返回任何值。如果出现问题 - 操作应该向客户端抛出“FaultException”。

但如果命令都是单向的 - 我在客户端该怎么办?

假设我在 WPF 客户端中有一个“添加产品”窗口,我输入信息并按“保存”。

我现在在服务中调用“AddProduct(Product)”,但是:

  1. 是否应该关闭窗口?
  2. 是否应该等待 10 秒以查看是否有任何 FaultException?
  3. 操作应该是“单向”吗?如果是这样 - 命令服务中的所有操作是否应该返回某种类型为“成功”或“失败”的通用“结果”对象?
  4. 如果第 3 部分为“是” - 我是否应该在单独的线程中调用该服务并“禁用”窗口上的所有控件,直到我从该服务收到响应?

谢谢。

【问题讨论】:

    标签: wcf command-query-separation


    【解决方案1】:

    我会说选项 3 是可行的方法,但您可能不需要通用 Result 对象来将错误传达给客户端。您可能知道,异常不会在 SOAP 消息中序列化,因此您不会在客户端获得任何常见的 .NET 异常。另一方面,您仍然可以通过在客户端捕获FaultException 来利用 SOAP 故障。因此,如果客户端没有发现异常,那么一切都很顺利。

    有关故障异常以及如何利用它们为您带来好处的更多信息,请查看:

    Specifying and Handling Faults in Contracts and Services

    【讨论】:

    • 所以如果我理解正确 - 我需要所有操作都不是单向的,并且所有操作都应该返回 VOID。如果操作出错 - 它应该返回“FaultException”,否则 - 客户端知道操作已正确执行。
    • 所以这也意味着调用应该在后台线程中完成 - 所以我不会在 WPF 客户端应用程序中挂起 UI 线程。对吗?
    • 正确。您绝对不应该出于用户体验目的而挂起 UI 线程。
    【解决方案2】:

    我认为使用 On-Way 很好,但您必须注意一些单向呼叫特性。如果您关心并且可以处理服务异常,那么 #4 是不错的选择。

    单向消息 - 一旦客户端发出调用,WCF 会生成请求消息,但不会将任何相关消息返回给客户端。服务端抛出的任何异常都不会到达客户端。

    您应该拥有的一件事是您的服务的可靠性,以便您可以确保请求已交付给服务。

    在没有传输会话(基本或wsHttp绑定)的情况下,如果调用单向操作时发生异常,客户端将不受影响,它可以继续在同一个代理实例上发送调用。

    如果存在传输会话 - 服务端异常将导致通道故障,因此客户端将无法重用代理来发送更多调用。这可以让您选择发现服务器端是否出现问题(但不是问题所在)。虽然,如果服务使用的是 FaultContracts,您仍然可能会遇到客户端不知道出现问题的情况。

    当服务抛出服务端故障合约中列出的异常时,这不会导致通信通道出现故障,因此使用单向合约的客户端无法检测到通信故障。

    【讨论】:

    • 您说:虽然,如果服务正在使用 FaultContracts,您仍然可能会遇到客户不知道出现问题的情况........为什么这么说?你能解释更多吗?
    • FaultException 作为故障消息传递给客户端。通过单向,您明确表示没有响应消息 - 包括故障消息。因此客户端将发出请求并继续前进,它不会等待响应消息(标准或错误)。因此,即使服务遇到错误并抛出 FaultException,客户端也不会看到错误
    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    相关资源
    最近更新 更多