FilePathResult 的已完成事件
Completed event for FilePathResult
我想在用户完成下载后做一些事情
public class TestController : Controller
{
public FilePathResult Index()
{
return File("path/to/file", "mime");
}
}
我尝试将以下事件添加到测试控制器,但它们都在用户完成下载之前触发(除了永远不会调用的析构函数)
protected override void EndExecute(IAsyncResult asyncResult)
{
base.EndExecute(asyncResult);
}
protected override void EndExecuteCore(IAsyncResult asyncResult)
{
base.EndExecuteCore(asyncResult);
}
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
}
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
~TestController()
{
//
}
客户端(浏览器)正在下载,下载完成后服务器不会通知您。使用 HTTP,您无法告诉客户端在下载后执行其他操作。
jQuery有现成的解决方案,请查看http://johnculviner.com/jquery-file-download-plugin-for-ajax-like-feature-rich-file-downloads/
这个想法很简单:在服务器端创建属性,在执行操作后设置自定义 cookie,在客户端使用 setTimeout 来检查这个 cookie 并在它到来时做一些事情.
如果你想在服务器上做一些事情,也许你可以使用 PushStreamContent。 Here is Whosebug answer and a blog entry.
一般需要两个线程,一个下载,一个通知。在服务器端,这些线程共享有关从文件长度发送了多少字节的信息。下载线程是通过 IHttpHandler 创建的,您可以在其中解析 http 查询并将字节逐个缓冲区写入 http 响应缓冲区,并使用通知线程更新共享信息。通知线程是来自您开始下载的页面的一些重复 ajax 查询。您还可以使用 jquery.
渲染下载进度条
您可以尝试使用此处所述的自定义 FileStreamResult - http://odetocode.com/blogs/scott/archive/2010/06/23/checking-client-download-success-with-asp-net-mvc.aspx。
public class CheckedFileStreamResult : FileStreamResult
{
public CheckedFileStreamResult(FileStream stream, string contentType)
:base(stream, contentType)
{
DownloadCompleted = false;
}
public bool DownloadCompleted { get; set; }
protected override void WriteFile(HttpResponseBase response)
{
var outputStream = response.OutputStream;
using (FileStream)
{
var buffer = new byte[_bufferSize];
var count = FileStream.Read(buffer, 0, _bufferSize);
while(count != 0 && response.IsClientConnected)
{
outputStream.Write(buffer, 0, count);
count = FileStream.Read(buffer, 0, _bufferSize);
}
DownloadCompleted = response.IsClientConnected;
}
}
private const int _bufferSize = 0x1000;
}
如您所见,WriteFile 方法被重写并实现自定义逻辑以通过从 FileStream 读取块并写入 OutputStream 来为客户端服务 response.OutputStream。在此过程结束时,您可以考虑下载文件。然后您可以在控制器的 OnResultExecuted 处理程序中检查 DownloadCompleted。或者,您可以尝试将自定义 Action 委托传递给 CheckedFileStreamResult 构造函数并在下载完成时调用它(而不是使用 DownloadCompleted 标志)。
我想在用户完成下载后做一些事情
public class TestController : Controller
{
public FilePathResult Index()
{
return File("path/to/file", "mime");
}
}
我尝试将以下事件添加到测试控制器,但它们都在用户完成下载之前触发(除了永远不会调用的析构函数)
protected override void EndExecute(IAsyncResult asyncResult)
{
base.EndExecute(asyncResult);
}
protected override void EndExecuteCore(IAsyncResult asyncResult)
{
base.EndExecuteCore(asyncResult);
}
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
}
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
~TestController()
{
//
}
客户端(浏览器)正在下载,下载完成后服务器不会通知您。使用 HTTP,您无法告诉客户端在下载后执行其他操作。
jQuery有现成的解决方案,请查看http://johnculviner.com/jquery-file-download-plugin-for-ajax-like-feature-rich-file-downloads/
这个想法很简单:在服务器端创建属性,在执行操作后设置自定义 cookie,在客户端使用 setTimeout 来检查这个 cookie 并在它到来时做一些事情.
如果你想在服务器上做一些事情,也许你可以使用 PushStreamContent。 Here is Whosebug answer and a blog entry.
一般需要两个线程,一个下载,一个通知。在服务器端,这些线程共享有关从文件长度发送了多少字节的信息。下载线程是通过 IHttpHandler 创建的,您可以在其中解析 http 查询并将字节逐个缓冲区写入 http 响应缓冲区,并使用通知线程更新共享信息。通知线程是来自您开始下载的页面的一些重复 ajax 查询。您还可以使用 jquery.
渲染下载进度条您可以尝试使用此处所述的自定义 FileStreamResult - http://odetocode.com/blogs/scott/archive/2010/06/23/checking-client-download-success-with-asp-net-mvc.aspx。
public class CheckedFileStreamResult : FileStreamResult
{
public CheckedFileStreamResult(FileStream stream, string contentType)
:base(stream, contentType)
{
DownloadCompleted = false;
}
public bool DownloadCompleted { get; set; }
protected override void WriteFile(HttpResponseBase response)
{
var outputStream = response.OutputStream;
using (FileStream)
{
var buffer = new byte[_bufferSize];
var count = FileStream.Read(buffer, 0, _bufferSize);
while(count != 0 && response.IsClientConnected)
{
outputStream.Write(buffer, 0, count);
count = FileStream.Read(buffer, 0, _bufferSize);
}
DownloadCompleted = response.IsClientConnected;
}
}
private const int _bufferSize = 0x1000;
}
如您所见,WriteFile 方法被重写并实现自定义逻辑以通过从 FileStream 读取块并写入 OutputStream 来为客户端服务 response.OutputStream。在此过程结束时,您可以考虑下载文件。然后您可以在控制器的 OnResultExecuted 处理程序中检查 DownloadCompleted。或者,您可以尝试将自定义 Action 委托传递给 CheckedFileStreamResult 构造函数并在下载完成时调用它(而不是使用 DownloadCompleted 标志)。