Javascript从c#方法获得进展

时间:2015-01-14 09:18:26

标签: c# asp.net-mvc progress

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

我的方法从各种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;

2 个答案:

答案 0 :(得分:1)

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

所以 - 不是点击链接来要求文件(并让浏览器在那里等待响应10分钟),你可以:

  1. 点击mvc控制器的链接"我想要这个,让我知道什么时候 你已经得到它" (它连接了SignalR方面的东西)
  2. 服务器进程下载内容 - 当它出现故障时,您可以保持跟踪 到目前为止多少广播进展...
  3. 浏览器端signalR消耗此广播("找到x字节"或 类似的 - 即"我做了很多事情") - 相应地查看更新。
  4. 一旦完成该过程,服务器广播就会发送一个"所有已完成,来得到它"然后浏览器下载结果。
  5. (最后一点,您甚至可以通过signalR直接发回找到的内容,但是您可能会遇到围绕数据限制/约束大小的问题。)

    HTH

答案 1 :(得分:0)

可能有信号器,但使用XSockets之类的东西和长时间运行的控制器听起来更合适。首先,自那个过程以来它运行很长时间,但也因为它可以将数据发送到具有status / info的任何特定客户端。 http://xsockets.net/docs/4/controllers

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