Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF客户端-我应该在后台线程中调用WCF服务吗?_Wcf_Command Query Separation - Fatal编程技术网

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

WPF客户端-我应该在后台线程中调用WCF服务吗?,wcf,command-query-separation,Wcf,Command Query Separation,我有一个WPF客户端,可以调用2个WCF服务 一个服务仅用于查询,一个服务用于命令() 我应该如何调用命令服务 我在某处读到命令服务中的所有操作都必须是“单向”的, 因为它们不应该返回任何值。如果出现问题,操作应该向客户端抛出“FaultException” 但是,如果命令都是单向的,那么在客户端我该怎么做 假设我在WPF客户端中有一个“AddProduct”窗口,我输入信息并按“Save” 我现在在服务中称为“AddProduct(Product)”,但是: 它应该关上窗户吗 它是否应该等待1

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

一个服务仅用于查询,一个服务用于命令()

我应该如何调用命令服务

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

但是,如果命令都是单向的,那么在客户端我该怎么做

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

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

  • 它应该关上窗户吗
  • 它是否应该等待10秒以查看是否没有任何故障异常
  • 操作是否应为“单向”?如果是-命令服务中的所有操作是否应返回某种类型的带有“成功”或“失败”的通用“结果”对象
  • 如果第3节为“是”-我是否应该在单独的线程中调用该服务并“禁用”窗口上的所有控件,直到我从该服务获得响应

  • 谢谢。

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

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


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

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

    您应该考虑的一件事是您的服务的可靠性,以便您能够确保请求已交付给服务

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

    如果存在传输会话-服务端异常将导致通道故障,因此客户端将无法重新使用代理发送更多呼叫。这可以让您选择发现服务器端是否出了问题(而不是出了什么问题)。尽管如此,若服务使用的是FaultContracts,那个么您仍然可以进入这样一种情况,即客户机不知道出了什么问题


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

    您说过:尽管如此,如果服务使用故障合同,您仍可能陷入客户机不知道出现了问题的情况。。。。。。。。你为什么这么说?您能解释更多吗?FaultException作为故障消息传递给客户端。对于单向,您明确表示没有响应消息,其中包括故障消息。因此,客户将提出请求并继续前进,它赢了;t等待响应消息(标准或故障)。因此,即使服务遇到错误并抛出FaultExceptions,客户端也不会看到错误。因此,如果我理解正确,我需要所有操作都不是单向的,并且所有操作都应返回VOID。如果某个操作出现故障-它应该返回一个“FaultException”,否则-客户端知道该操作已正确执行。因此,这也意味着调用应该在后台线程中完成-因此我不会在WPF客户端应用程序中挂起UI线程。对吧?对。你绝对不应该为了用户体验而挂起UI线程。