2012-03-25 7 views
0

バックアップを作成するためのコードは、LinuxおよびWindowsのASP .NET MVC2アプリケーションです。完了したら、ログファイルにエントリを書き込む必要があります。このコードはプロセス終了イベントに書き込みます。MVCコントローラでの検出の検出方法

終了イベント書き込みが早すぎます:データがクライアントに送信されない可能性があります。すべてのデータが送信された場合にイベントログに書き込む方法は?ストリームにClosedイベントがありません。

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

あなたはasynchronous controller使用してみてください可能性があります

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"); 
    } 
} 
+0

をウィンドウでこれを使用すると、pg_dumpは終了したことがないと出るイベントは発生しません。デッドロックが発生したようです。これを修正するには? – Andrus

+0

それはちょうど時間がかかりますか? –

+0

いいえ、私は8 cpusで7の高速ローカルホストをテストしましたが、データベースは小さいです。私の元のコードを使って数秒間終了します。元のコードにStdErrorリダイレクトを追加すると、シミックの問題が発生します。私はこの質問をhttp://stackoverflow.com/questions/9863753/how-to-capture-stderr-of-pg-dump-invoked-from-asp-net-mvc2-controllerに掲載しました。 – Andrus