FilePathResult的已完成事件

Alm*_*mis 14 c# asp.net-mvc controller fileresult

用户完成下载后我想做点什么

public class TestController : Controller
{
    public FilePathResult Index()
    {
        return File("path/to/file", "mime");
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试的是将以下事件添加到测试控制器,但它们都在用户完成下载之前触发(除了析构函数,它永远不会被调用)

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()
{
    //
}
Run Code Online (Sandbox Code Playgroud)

Evk*_*Evk 3

您可以尝试使用自定义 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;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,WriteFile 方法被重写,并实现了自定义逻辑,通过从 FileStream 读取块并写入 OutputStream 来向客户端提供response.OutputStream。在此过程结束时,您可以考虑下载文件。然后您可以在控制器的 OnResultExecuted 处理程序中检查 DownloadCompleted。或者,您可以尝试将自定义 Action 委托传递给 CheckedFileStreamResult 构造函数,并在下载完成时调用该委托(而不是使用 DownloadCompleted 标志)。