4

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

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

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

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

但是如果命令都是单向的 - 我在客户端做什么?

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

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

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

谢谢。

4

2 回答 2

1

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

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

指定和处理合同和服务中的错误

于 2012-05-12T18:41:43.493 回答
1

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

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

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

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

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

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

于 2012-05-12T20:21:15.263 回答