wcf 宁静服务中的长时间计算

Posted

技术标签:

【中文标题】wcf 宁静服务中的长时间计算【英文标题】:Long calculation in a wcf restful service 【发布时间】:2012-06-28 22:34:48 【问题描述】:

我有一个 WCF RESTful 服务,它工作正常,问题是该服务公开了一个“计算”方法,可能需要几分钟才能完成计算,而且由于 REST 是一种无状态方法,我快用完了的想法!

我应该保持会话吗?

如何进行回调?

在一个网站等10分钟响应不方便,但我必须找到解决办法。

PS:服务必须是restful,我不能减少计算时间。

【问题讨论】:

调用您的服务的客户的性质是什么? 服务很安静,因为很多客户端都可以调用它; Winforms、Silverlight、android、... 【参考方案1】:

我询问了您的客户,因为如果他们只是 .Net,您可以实现异步编程模型,但因为他们不是...

你可以在这篇文章中做类似的事情 - WCF Rest Asynchronous Calling Methods

基本上,您的方法将产生一个额外的线程来执行实际的计算工作,并在主线程中立即将某种令牌返回给调用客户端。然后客户端可以在轮询方法中使用此令牌来检查计算是否完成。

【讨论】:

非常感谢@EkoostikMartin,这似乎是最好的解决方案,但我想知道如何实现异步模型(只是为我的老板寻找论据:D) 见这里 - level533.com/2010/11/… 和这里 ***.com/a/5959371/903056 - 这并不难完成,也很酷,因为你仍然可以同步提供相同的服务(如果对你有帮助,请标记我的答案:) ) 再次感谢@EkoostikMartin,它有很大帮助(对不起,我是新来的,我没有注意标记:D) 不客气,如有任何后续问题,请随时在此处添加,我会尽力解答。【参考方案2】:

您可以创建一个单向 WebMethod 来提交初始计算请求。在您的计算代码中,您需要更新一个数据库表或类似的进度,无论是百分比还是完成。

然后,您需要使用上表创建一个额外的“轮询”方法,您可以使用它来检查状态。

当您的计算方法将其标记为完成时,您可以调用最终的“GetResults”方法来完成此操作。

我们对通过网络服务提交的大文件导入做了类似的事情,效果很好。

一些信息;

http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapdocumentmethodattribute.oneway(v=vs.71).aspx

【讨论】:

WCF Rest 服务不是基于肥皂的(它的 webhttp),我认为这不会起作用。

以上是关于wcf 宁静服务中的长时间计算的主要内容,如果未能解决你的问题,请参考以下文章

WCF - 长时间打开通道是不好的做法吗?

“/literal/param/literal”是 WCF 宁静服务的有效 url 模板吗

Swift - 计算经过的时间需要太长时间?

无法获得 WCF 宁静服务以使用 https/ssl

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

用于运行调度程序长时间运行任务的 Web Api 或 WCF