Как сделать резервную копию базы данных PostgreSql из браузера в приложении MVC2 на Mono - PullRequest
1 голос
/ 23 марта 2012

Приложение Mono MVC2 используется для резервного копирования базы данных PostgreSql из браузера.

После некоторого времени работы возникает исключение, из-за которого поток прерывается (полное сообщение об ошибке ниже).pg_dump работает, но выглядит так, как будто он прерван.apache error_log содержит выходные данные, заканчивающиеся в середине строки.

Как создать резервную копию из базы данных PostgreSql, которую можно сохранить из браузера через Интернет?

Используя mod_mono с Apache

Андрус.

[Authorize]
public class BackupController : ControllerBase
 {
   [AcceptVerbs(HttpVerbs.Get)]
   public ActionResult Backup()
   {
            var pinfo = new ProcessStartInfo();
            var fn = "backup.backup";
            pinfo.Arguments = " -ib -Z6 -f \"" + fn + "\" -Fc -h \"" + "myserver" + "\" -U \"" +
                "postgres" + " \"" + "mydb" + "\"";
            pinfo.FileName = "/usr/bin/pg_dump";
            pinfo.UseShellExecute = false;
            using (var process = new Process())
            {
                process.EnableRaisingEvents = true;
                process.StartInfo = pinfo;
                process.Start();
                while (!process.HasExited)
                    Thread.Sleep(2000);
                process.WaitForExit();
                if (process.ExitCode!=0)
                  throw new Exception("error");
                process.Close();
            }
            Response.ClearContent();
            Response.WriteFile(fn);
            Response.End();
            System.IO.File.Delete(fn);
            return null;
        }
}

результат:

Server Error in '/myapp' Application
--------------------------------------------------------------------------------

Thread was being aborted
Description: HTTP 500. Error processing request.
Stack Trace: 

System.Threading.ThreadAbortException: Thread was being aborted
  at System.Web.HttpApplication.async_handler_complete_cb (IAsyncResult ar) [0x0002d] in /usr/src/redhat/BUILD/mono-2.10.2/mcs/class/System.Web/System.Web/HttpApplication.cs:1010 
  at System.Web.Mvc.Async.AsyncResultWrapper+WrappedAsyncResult`1[System.Web.Mvc.Async.AsyncVoid].Begin (System.AsyncCallback callback, System.Object state, Int32 timeout) [0x00000] in <filename unknown>:0 
  at System.Web.Mvc.Async.AsyncResultWrapper.BeginSynchronous[AsyncVoid] (System.AsyncCallback callback, System.Object state, System.Func`1 func, System.Object tag) [0x00000] in <filename unknown>:0 
  at System.Web.Mvc.Async.AsyncResultWrapper.BeginSynchronous (System.AsyncCallback callback, System.Object state, System.Action action, System.Object tag) [0x00000] in <filename unknown>:0 
  at System.Web.Mvc.MvcHandler.BeginProcessRequest (System.Web.HttpContextBase httpContext, System.AsyncCallback callback, System.Object state) [0x00000] in <filename unknown>:0 
  at System.Web.Mvc.MvcHandler.BeginProcessRequest (System.Web.HttpContext httpContext, System.AsyncCallback callback, System.Object state) [0x00000] in <filename unknown>:0 
  at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest (System.Web.HttpContext context, System.AsyncCallback cb, System.Object extraData) [0x00000] in <filename unknown>:0 
  at System.Web.HttpApplication+<Pipeline>c__Iterator6.MoveNext () [0x00d42] in /usr/src/redhat/BUILD/mono-2.10.2/mcs/class/System.Web/System.Web/HttpApplication.cs:1365 
  at System.Web.HttpApplication.Tick () [0x00000] in /usr/src/redhat/BUILD/mono-2.10.2/mcs/class/System.Web/System.Web/HttpApplication.cs:932  

--------------------------------------------------------------------------------
Version information: Mono Runtime Version: 2.10.2 (tarball Mon Apr 18 18:57:39 UTC 2011); ASP.NET Version: 2.0.50727.1433
...