Как обнаружить отправку завершено в контроллере MVC - PullRequest
0 голосов
/ 26 марта 2012

Код ниже используется для создания резервной копии приложения ASP .NET MVC2 в Linux и Windows. По завершении запись должна быть записана в файл журнала. Этот код записывает его в событие Exit процесса.

Запись события выхода слишком рано: данные могут не отправляться клиенту. Как записать в журнал событие, если все данные отправлены? Поток не имеет закрытого события.

public class BackupController : ControllerBase 
    { 
        [AcceptVerbs(HttpVerbs.Get)] 
        public FileStreamResult Backup() 
        { 
            var process = new Process(); 
            process.StartInfo.FileName = "c:\\Program Files\\PostgreSql\\9.1\\bin\\pg_dump.exe"; 
            process.StartInfo.UseShellExecute = false; 
            process.StartInfo.RedirectStandardOutput = true; 
            process.EnableRaisingEvents = true; 
            process.Exited += (sender, e) => 
            { 
                TempData["ExitCode"] = process.ExitCode; 
                // todo: how to write this if all data is sent: 
                Writelog( "Backup has completed" ); 
            }; 
            Server.ScriptTimeout = 1 * 60 * 60; 
            process.Start(); 
            return new FileStreamResult(process.StandardOutput.BaseStream, "application/backup"); 
    } 
}

1 Ответ

1 голос
/ 26 марта 2012

Вы можете попробовать использовать асинхронный контроллер :

public class HomeController : AsyncController
{
    public void IndexAsync()
    {
        var process = new Process();
        process.StartInfo.FileName = "c:\\Program Files\\PostgreSql\\9.1\\bin\\pg_dump.exe";
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = true;
        process.EnableRaisingEvents = true;
        AsyncManager.OutstandingOperations.Increment();
        process.Exited += (sender, e) =>
        {
            var proc = ((Process)sender);
            string result = null;
            if (proc.ExitCode == 0)
            {
                result = proc.StandardOutput.ReadToEnd();
            }
            else
            {
                result = proc.StandardError.ReadToEnd();
            }
            AsyncManager.Parameters["result"] = result;
            AsyncManager.OutstandingOperations.Decrement();
            Writelog("Backup has completed");
        };
        process.Start();
    }

    public ActionResult IndexCompleted(string result)
    {
        return File(Encoding.UTF8.GetBytes(result), "text/plain");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...