2013-05-09 41 views
1

在我的MVC 4应用程序,我有一个从客户端计算机上传文件,以期:如何在MVC 4操作中的漫长批处理过程中返回状态信息?

<snip> 
@using (Html.BeginForm("Batch", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <input class="full-width" type="file" name="BatchFile" id="BatchFile" 
    <input type="submit" value="Do It" /> 
} 
<snip> 

在家里控制器的“批量”操作需要该文件,并在某种程度上可能会对其进行处理非常漫长....分钟连:

<snip> 
[HttpPost] 
public FileResult Batch(ModelType modelInstance) 
{ 
    // Do the batch work. 
    string result = LengthyBatchProcess(modelInstance.BatchFile.InputStream) 
    var encoding = new ASCIIEncoding(); 
    Byte[] byteArray = encoding.GetBytes(result); 
    Response.AddHeader("Content-Disposition", "attachment;filename=download.csv"); 
    return File(byteArray, "application/csv"); 
} 
<snip> 

这一切工作正常,这是不是用户被锁定为它花费的批处理进程运行时的固有问题。事实上,他们期望它。问题是用户可能无法知道这个过程是需要几秒钟还是几分钟的时间,并且我想在运行LongyBatchProcess时向他们提供状态信息。我研究了不引人注目的ajax,但它似乎没有必要的功能,除非有某种方法可以链接不显眼的ajax调用。关于如何最好地设计这个的任何想法?提前谢谢了。

回答

1

你想达到什么需要一点工作。

一种方法是打开另一个通道(ajax调用)来获取进度报告。从How do you measure the progress of a web service call?引述:

收件可以通过使已被调度并返回0-100(或0.0和1.0,或任何之间的近似值的作业的ID查询在服务器上一个单独的方法)它有多远。

我在这个问题上找到了a great tutorial

+1

教程看起来不错,我迫不及待地想尝试一下。谢谢。 – 2013-05-13 01:39:19

0

是的,你可以开始下载文件中chuncks,使用户可以看到浏览器的下载进度:

try 
{ 
    // Do the batch work. 
    string result = LengthyBatchProcess(modelInstance.BatchFile.InputStream) 
    var encoding = new ASCIIEncoding(); 
    Byte[] byteArray = encoding.GetBytes(result); 

    Response.Clear(); 
    Response.ClearContent(); 
    Response.Buffer = true; 
    Response.AddHeader("Content-Disposition", 
         "attachment;filename=download.csv"); 
    Response.ContentType = "application/csv"; 
    Response.BufferOutput = false; 

    for (int i = 0; i < byteArray.Length; i++) 
    { 
     if (i % 10000 == 0) 
     { 
      Response.Flush(); 
     } 

    Response.Output.WriteLine(byteArray[i]); 
    } 
} 
catch (Exception ex) 
{ 
} 
finally 
{ 
    Response.Flush(); 
    Response.End(); 
}   
+0

这是一个好主意,但我不认为它会像书面一样工作,因为它只会显示在文件下载过程中缓冲输出的进度。相反,在批处理过程中必须写出响应,这可能是可行的,但在我的情况下,需要对代码进行一些实质性的重新分解。但我很欣赏这个想法。谢谢。 – 2013-05-13 01:28:51

+0

你说过:'这一切都正常,并且它并不是一个固有的问题,用户在批处理过程运行所需的时间内被锁定。实际上,他们期望它。 因此,考虑重构是否值得付出。 您可以将鼠标指针更改为“繁忙”,或点击显示一些gif动画。 大多数时候,当用户知道她正在做一个漫长的操作,并显示一些指示 - 他们满意:) – graumanoz 2013-05-13 05:43:04

相关问题