正确的方法来实现对长时间运行的服务器端方法的客户端调用

时间:2016-09-14 08:42:17

标签: c# .net wcf asynchronous

我正在研究WCF中的SOAP-client,以便与自托管的WCF服务进行通信,以便远程控制我正在开发的软件。这个软件有一个非常长的运行操作(让它称之为Print),运行几分钟,可能长达一个小时。我试图找出如何实现方法Print给出以下要求:

  1. 如果出现问题,服务器应该能够向客户端提出FaultExceptions
  2. 如果与服务的连接丢失,应尽快通知客户。
  3. 如果断开连接,Print的服务器端进程应继续运行,以便客户端可以重新连接并继续监视进程并在必要时中止该进程。
  4. 由于我是WCF的新手,我不确定如何实现这一点。我目前看到两种选择:

    1. 使Print成为async方法,以便我可以“触发并忘记”它,直到它完成或抛出FaultException。这看起来很简单,但我看到这个“问题”:WCF中有一个客户端请求超时,默认值为1分钟,这也适用于async方法(如果我没有记错的话)因此,我必须大幅增加。这看起来有点像黑客。
    2. 通过将其行为拆分为启动服务器端的 - async方法Print来实现async我自己的StartPringing行为打印和直接返回的任务(或在出现问题时抛出异常)和客户端回调方法PrintingFinished。然后,我可以使用回调PrintingFinished向客户端发出信号,表示打印过程已完成或使用额外的回调PrintingFailed来发送异常,以防出现问题。此实现将隐藏在async方法Print后面,因此它的行为类似于可能引发异常的任何其他async方法。在这里,我看到了以下挑战:我将不得不自己实现整个异常回调 - 来处理StartPringing返回后发生的异常(来自StartPringing本身我可以抛出FaultExceptions)。
    3. 对于这两种情况,我将不得不弄清楚如何检测连接是什么时候(我正在使用服务上的ping方法进行连接)然后以某种方式获取该事件以从方法中抛出异常{ {1}}。实现方式这似乎更符合替代方案(2),因为我需要在打印过程完成或抛出异常时实现所有其他事件处理程序。但是我不确定如何实现替代(1)。

      所以两种选择中的哪一种“更好”。更好的是指以下注意事项:   1.与WCF中的“标准”方式一致,以实现这种长期运行的方法。   2.可维护性和可扩展性。

      如果我应该考虑任何其他选择,我将不胜感激任何其他建议。

1 个答案:

答案 0 :(得分:0)

对于我对你的问题的理解,我认为如果你需要一个可靠的真正异步通信来使用像MSMQ这样的消息队列。您可以将其与WCF一起使用:https://msdn.microsoft.com/en-us/library/ms789048(v=vs.110).aspx

更新

在您的情况下,您可以使用SOAP调用将print命令发送到服务器,因为它已同步,您需要知道服务器是否处理请求。在打印操作后很长并且异步。当此操作完成(异常与否)时,它需要通知客户端。但客户端可能会被关闭。对于该通信,消息队列是解决方案,MQ确保消息将被传输。 https://en.wikipedia.org/wiki/Message_queue

如果您不想使用MSMQ,则可以在客户端实现Web服务以由打印服务器通知,例如使用UUID来匹配内存或数据库中的映射中的调用和通知。