WPF客户端 - 我应该在后台线程中调用WCF服务吗?

时间:2012-05-12 09:57:12

标签: wcf command-query-separation

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

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

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

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

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

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

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

  1. 它应关闭窗户吗?
  2. 是否应该等待10秒才能看出是否有任何FaultException?
  3. 操作应该是'单向'吗?如果是这样 - 命令服务中的所有操作是否应该返回某种类型的通用'Result'对象,其中'succeeded'或'failed'?
  4. 如果第3部分为“是” - 我是否应该在一个单独的线程中调用该服务并“禁用”窗口上的所有控件,直到我从服务中得到回复为止?
  5. 感谢。

2 个答案:

答案 0 :(得分:1)

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

有关故障异常以及如何将它们用于您的利益的更多信息,请查看:

Specifying and Handling Faults in Contracts and Services

答案 1 :(得分:1)

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

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

您应该具备的一点是服务的可靠性,以便您可以确保已将请求发送到服务。

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

如果存在传输会话 - 服务端异常将使通道出错,因此客户端将无法重新使用代理来发送更多呼叫。这可以为您提供一个选项来发现服务器端是否出现问题(但不是出了什么问题)。虽然,如果服务使用的是FaultContracts,您仍然可以进入客户端不知道出现问题的情况。

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