【问题标题】:Javascript get progress from c# methodJavascript从c#方法中取得进展
【发布时间】:2025-12-10 02:10:02
【问题描述】:

我有一个 MVC 项目,在我的视图中我有一个指向我的控制器中的方法的链接,该方法返回一个可下载的文件。

My Method 从各种 API 下载数据并将数据处理到文件中。此方法需要 10-15 分钟才能完成。

我想在我的视图中显示进度,最好的方法是什么?我应该在我的方法设置的控制器中使用全局变量,并使用异步 javascript 循环来获取这些值吗?

有什么好的方法可以从 api 请求中获取进度,我使用以下方法:

    var httpWebRequest = (HttpWebRequest)WebRequest.Create(DataValues.xx + "url/" + label + "/" + UUID + "?action=" + act);
    httpWebRequest.ContentType = "application/json";
    httpWebRequest.Method = "PUT";
    httpWebRequest.Credentials = new NetworkCredential(DataValues.user, DataValues.password);
    httpWebRequest.PreAuthenticate = true;

【问题讨论】:

  • 将您的状态保存到会话变量中,并每隔 x 秒使用 ajax 查询状态,然后更新视图 ;-)
  • 您的 API 方法必须以某种方式定期发送状态(以百分比或其他形式),然后您需要在 jQuery 中轮询更新(或者如果您使用的是 HTML5,请利用服务器发送事件)。

标签: c# asp.net-mvc progress


【解决方案1】:

对于真正长时间运行的进程,您可以考虑使用 SignalR 之类的东西来发回状态更新。

因此,与其单击链接来请求文件(并让浏览器在那里等待 10 分钟等待响应),您还可以:

  1. 戳 mvc 控制器的链接“我想要这个,什么时候告诉我
    你明白了”(它连接了 SignalR 方面)
  2. 服务器进程下载内容 - 下载内容时您可以跟踪 到目前为止有多少和广播进度...
  3. 浏览器端 signalR 使用此广播(“找到 x 字节”或 类似 - 即“我已经做了 X 很多”) - 相应地查看更新。
  4. 该过程完成后,服务器广播会发送“全部完成,快来获取它”,然后浏览器下载结果。

(最后一点,您甚至可以通过 signalR 将找到的内容直接发回,但您可能会遇到有关数据限制/约束大小的问题。

HTH

【讨论】:

    【解决方案2】:

    可能使用信号器,但使用 XSockets 之类的东西及其长期运行的控制器听起来更合适。首先,因为该进程运行时间很长,而且因为它可以将数据发送到具有状态/信息的任何特定客户端。 http://xsockets.net/docs/4/controllers

    另一个原因是 XSockets 支持信号器不支持的二进制数据。 我认为 XSockets 最新版本是商业化的,但之前的版本是免费使用的。

    【讨论】: