【问题标题】:Long Process in ASP.NET Web Forms - Browser TimeoutASP.NET Web 窗体中的长进程 - 浏览器超时
【发布时间】:2017-03-13 12:51:45
【问题描述】:

我意识到这个问题有不同的变体,但 .net 具有更新的功能(例如异步等待),我想知道哪种解决方案是最好的。

我有一个 C# .Net Web Forms 应用程序,它有一个长时间运行的任务:该任务处理用户请求,他们上传 csv 数据文件,序列化为对象,然后导入数据库。该任务可能需要几分钟,并且浏览器会定期超时 - 这会导致可用性问题。

我见过很多解决方案,而用户将上传数据,然后在后台执行任务。然后页面会间歇性地调用服务器来请求任务的状态,从而让用户了解进度。

我想知道这是如何实现的?我在桌子上看到的选项:

  • Windows 服务
  • Web 服务 - 这是如何托管的:IIS 还是 Windows 服务?
  • 异步,等待 - 这可能吗?

【问题讨论】:

    标签: c# asp.net wcf webforms async-await


    【解决方案1】:

    我认为您可以采用两种不同的方法。

    第一种方法是拉取方法,您将在服务器中(可能在会话中)保持每个用户的进程状态,并让进程更新该状态,然后客户端可以通过 ajax 定期拉取实际状态。 ajax调用是从客户端的浏览器进行的,函数可以放在客户端正在查看的同一个网页中,如果只从那里使用就不需要分开了。

    第二种可能是推式方法,它有点复杂,但可以为您提供其他可能性。您将需要使用像 signalr https://www.asp.net/signalr 这样的库,它允许您从服务器与客户端的浏览器进行通信,调用 JS 函数,并将更新的状态推送到客户端的表单。这可以创造更实用的双向通信和更好的用户体验,以换取更多的复杂性。

    【讨论】:

    • 感谢您的评论。你会建议我在哪里实际运行这个过程?正如我所说,如果我直接在 APP 中进行,则线程被捆绑,因此浏览器会挂起直到完成。
    • 您可以启动一个新线程并调用该线程中的进程,主线程将返回客户端,而新线程将忙于处理和更新其状态
    • 我设法通过在并行线程中运行这些进程,然后以小间隔对进程进行 ajax 调用以请求进度更新,从而找到了解决方案。但是,我不确定我使用的是正确的技术。我以前会认为我应该在这里使用某种服务。
    • 我不确定我是否正确,但如果“服务”是指让您的进程作为 Windows 服务在后台运行,则可以这样做,但这不会对性能影响很大。如果目标是从不同的调用者那里获得可访问性,我会采用这种方法,例如,如果你想从不同的网站或可执行文件调用这个过程,那么让它成为服务的麻烦就值得了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 2011-02-06
    • 2012-03-19
    相关资源
    最近更新 更多