我有一个执行任务的Web服务,可能需要数小时才能完成(异步)
我想与连接到服务器的所有客户端分享该任务的状态(我正在使用Web应用程序)
例如,调用页面http://localhost/process.aspx的第一个客户端 将实例化Web服务,它将调用一个方法来开始执行任务。将显示一个百分比数字,显示完成状态。我可以通过使用AJAX轮询Web服务来完成此任务。
如果有另一个客户端试图打开该页面,它应该获得相同的百分比信息,因此不会创建新的Web服务实例。
这样做的最佳方法是什么? 我想到了不同的解决方案但迟早会发现新的问题。 这些是一些可能的替代方案:
你们有其他想法吗?我不太熟悉设计网站,这让我发疯。如果你们能提供一些代码片段,我将不胜感激。
由于
答案 0 :(得分:0)
问题是确保与单个流程实例相关的信息只存储在一个地方。
例如,可以通过使用Application对象来应用您的初始想法,但这会在群集IIS方案中出现故障。
我并不认为数据库是绝对最好的解决方案,但我相信它会给你你想要的东西。
如果有100个客户尝试同时启动该流程,那么只有一个会成功,对吧?数据库锁定工具将帮助您实现这一目标。
答案 1 :(得分:0)
有一种方法(我假设Web服务的WCF)允许您只有一个服务运行实例... link
我认为这是你想要完成的事情。
答案 2 :(得分:0)
假设我已正确理解您的要求。您的Web服务不应该创建“worker”对象的实例。
您的网络服务请求应该记录到数据库(如另一张海报所述)或某些消息队列的消息队列。此时,您的“工人”处理器(可能是某种类型的服务)应该根据需要接管工作。
基本上你想把你的应用程序分解成这样的东西
<强> | Webservice | ---------- | Datastore |-----------| Worker |
强>
有关批处理的任何进一步请求应由查询数据存储区的Web服务进行管理。
请记住,网络服务并非设计工作。