实现对长时间运行的服务器端方法的客户机调用的正确方法
本文关键字:方法 客户机 调用 服务器端 长时间 运行 实现 | 更新日期: 2023-09-27 18:06:51
我正在使用WCF中的soap客户端与自托管的WCF服务进行通信,以远程控制我正在开发的一个软件。这个软件有一个非常长的运行操作(我们称之为Print
),它将运行几分钟,也许长达一个小时。我正试图找出如何实现方法Print
给定以下要求:
- 服务器应该能够将
FaultExceptions
提升到客户端,以防出现问题。 - 如果服务连接丢失,应该尽快通知客户端。
- 如果
Print
的服务器端进程断开,应该继续运行,以便客户端可以重新连接并继续监视该进程,并在必要时中止该进程。
因为我是新的WCF,我不确定如何实现这一点。我目前看到两种选择:
- 使
Print
和async
方法,这样我就可以"触发并忘记"它,直到它完成或抛出FaultException
。这似乎很直接,但我看到了这个"问题":在WCF中有一个默认值为1分钟的客户端请求超时,这也适用于async
方法(如果我没有错的话),因此我必须显着增加。这看起来有点像黑客。 - 实现
Print
自己的async
行为,将其行为分解为非-async
方法StartPringing
,该方法启动服务器端打印任务并直接返回(或在出现问题时抛出异常)和客户端回调方法PrintingFinished
。然后,当打印过程完成时,我可以使用回调PrintingFinished
向客户端发出信号,或者在出现问题时使用额外的回调PrintingFailed
发送异常。这个实现将被"隐藏"在async
方法Print
之后,这样它的行为就像任何其他可能抛出异常的async
方法一样。在这里,我看到了以下挑战:我将不得不自己实现整个异常回调的东西,以处理在StartPringing
返回后发生的异常(从StartPringing
本身,我可以抛出FaultExceptions)。
对于这两种情况,我都必须弄清楚如何检测,当连接被服务时(我目前正在使用服务上的ping方法),然后以某种方式让该事件从方法Print
中抛出异常。在实现方面,这似乎更符合备选方案(2),因为我需要在打印过程完成或抛出异常时实现所有其他事件处理程序。然而,我不确定如何为替代方案(1)实现这一点。
那么两种选择中哪一种"更好"呢?我所说的"更好"是指以下几点考虑:1. 与WCF中实现这种长时间运行方法的"标准"方式保持一致。2. 可维护性和可扩展性。
对于我所理解的你的问题,我认为如果你需要一个真正的异步通信与可靠性使用消息队列如MSMQ。您可以与WCF一起使用:https://msdn.microsoft.com/en-us/library/ms789048(v=vs.110).aspx
更新在您的情况下,您可以使用SOAP调用向服务器发送打印命令,因为它是同步的,并且您需要知道服务器是否处理请求。在印刷后操作时间长且不同步。当此操作完成(无论是否异常)时,它需要通知客户端。但是客户端可能会被关闭。对于这种通信,消息队列是解决方案,MQ确保消息将被传输。https://en.wikipedia.org/wiki/Message_queue
如果你不想使用MSMQ,你可以在客户端实现一个由打印服务器通知的web服务,例如使用UUID来匹配内存或数据库中的映射中的调用和通知。