È possibile provare a utilizzare FileStreamResult personalizzato come descritto qui - 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;
}
Come si vede, il metodo WriteFile è sovrascritto e logica personalizzata viene implementata per servire Response.OutputStream al cliente per la lettura di pezzi da FileStream e scrivendo a OutputStream. Alla fine di questo processo puoi considerare il file scaricato. Quindi puoi controllare DownloadCompletato nel gestore OnResultExecuted del controller. In alternativa, è possibile provare a trasferire il delegato Azione personalizzato al costruttore CheckedFileStreamResult e richiamarlo al termine del download (anziché utilizzare il flag DownloadCompleted).
Non voglio dirgli di fare qualcos'altro. Il server che invia lo stream quindi dovrebbe sapere quando è finito. – Almis