【问题标题】:Pause server side execution and continue based on user input暂停服务器端执行并根据用户输入继续执行
【发布时间】:2012-12-14 21:06:45
【问题描述】:

我有一个要求,我在 Web 应用程序的服务器上处理一些 XML
假设在asp.net 页面上有一个按钮。当用户单击按钮时,我会调用一个函数,例如 button_click() ->,该函数又会调用一些服务方法来处理 XML。

问题场景::
现在假设我正在处理 XML,并且完成了 50% 的处理。我注意到 我必须得到用户的确认,因为 XML 中的某些值是无效的。此时,我想向用户显示是或否的提示(可能是 javascript 提示),然后:
1. 如果用户点击确定 -> 我想继续处理剩下的 50% 的 XML
2. 如果用户点击NO -> 我想停止处理并显示错误信息。

经过大量的试验和错误以及我开发 Web 应用程序的知识,我觉得没有办法做到这一点,除非我在用户单击 OK 时使用一些标志再次开始执行我的服务。但我的同事们并不相信,他们说一定有办法做到这一点,而我缺乏这方面的知识。 这是一个有趣的问题

**注意:我们实际上是将现有的桌面应用程序移植到网络中,因此会出现对话框问题!

我请求你帮我解决这个问题!另外我想知道有没有其他方法可以处理这种情况?

编辑:添加更多信息。
实际上,我在这里所说的 XML 处理是指每个用户都有一些由服务器使用 WINDOWS 服务创建的 XML。当用户单击某个按钮时,我们必须处理该 XML,如果一切正确,我们必须调用第三方服务并获取结果并更新数据库。
有时会发生的情况是,创建 XML 的 WINDOWS 服务会放入一些无效值(我们无法更正它们,因为它不受我们的控制)。因此,我们需要向用户确认某些值无效以及他是否要继续。通过这种方式,我们希望双重确保我们在用户同意的情况下发送无效值。问题是我们有时会在 XML 文件的末尾识别出无效的值(我们无法更改),所以我们不想再次处理 XMl!

【问题讨论】:

  • 我想第一个问题是 - 处理(无论是什么)本身可以暂停吗?这似乎更像是您应该问的问题,因为确认对话框/继续部分非常简单。
  • @James - 输入!使用您的输入修改了我的问题:)
  • @GuruC 我更新了你的问题标题,所以它更具体一点。为了让我了解服务器端发生了什么,您能否详细说明“处理 XML”实际上在做什么?值得更新您的问题,以便其他人更好地理解。
  • @GuruC:所以处理是异步的,在响应发送之前没有完成?

标签: javascript asp.net dialog request pausing-execution


【解决方案1】:

您应该设置一个流程,让前端(jquery/JavaScript)不断地从长时间运行的流程中轮询状态更新。一个典型的使用是你想更新一个完成百分比表,这样用户就可以看到正在取得的进展,除了在这种情况下,你不是检索 %done 值,而是检索一个状态代码和/或消息。如果有消息,将其显示给用户并更新回服务器;一旦状态码被发送到前端,支持的进程将进入等待状态,并且还需要轮询用户响应的标志(例如可以像 db 表中的值一样简单)。

这里是 %done 类型轮询过程的示例:

http://sudhirmurthy.blogspot.com/2011/12/update-on-long-running-server-tasks.html

【讨论】:

  • @Brennan - 问题是过程本身不是很长。只是我们在处理来自用户的过程中需要一些确认。我们也不需要总是显示对话框。只有当 XML 中存在无效值时,我们才必须显示它。我在我的问题中添加了更多信息!
  • 不管多长时间,一旦前端启动进程,它应该立即开始在服务器上轮询一个表示进程的值,而不是完成百分比,而是一些用户定义的表明需要一个构象的值。您需要查看链接文章中的代码,并将其从报告完成百分比改为报告状态代码,即“正在运行”、“等待用户确认”、“完成” - 您需要将其视为前端正在轮询后端以获取更新,而不是后端需要向前端发送异常。
【解决方案2】:

由于您没有详细说明您的“XML 处理”的具体细节,我假设它正在上传/解析 XML 文档(可能是某种导入)。

第一步是让您的服务器能够在特定状态下暂停 XML 的执行(或处理)。您能够做到这一点的唯一方法是存储处理的当前状态,例如行号,已处理的段等。然后,此状态需要存储在某个位置,以允许服务器从中断的地方继续,即服务器上的临时文件、内存缓存、后端数据库 - 由您选择最适合的存储适合您的应用。

下一步是在处理暂停时通知客户端。由于这应该是一个原子操作,您可以使用一种称为Long Polling 的技术来保持与服务器的连接更长时间(更少轮询),并使通知感觉更加即时。或者,您可以使用定期轮询并定期查询状态 - 无论哪种方式,服务器的特定响应都会触发客户端抛出对话框。

最后,您想告诉服务器如何继续 - 这可以通过一个简单的 API 调用来完成,因为服务器拥有继续处理所需的所有信息。

例如,API 可能如下所示:

public void ConfirmProcessing(Guid processingInstanceId, bool cancel)
{
     var processingState = GetProcessingStateFromStorage(processingInstanceId);
     if (!cancel)
     {
         // resume processing
     }
     else
     {
         // discard processing
     }
}

当您收到来自服务器的确认通知时,它可能会发送一个唯一 ID(即processingInstanceId),然后您通过 API 将其发送回来,并带有一个标志,指示您希望如何继续,例如继续/取消。

【讨论】:

    猜你喜欢
    • 2017-10-01
    • 2014-12-20
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多