我在在cmd、C#中使用命令为PostgreSQL创建数据库、登录角色,并对数据库进行备份和恢复中写出了postgresql的备份恢复的具体方法,但是,当代码从visual studio中发布并部署到IIS上后,不论是备份还是恢复,都不能运行了。
首先,写出备份的代码:
using System.Diagnostics; //一定要引用这个命名空间 private static string result_success = ""; private static string result_error = ""; //备份数据库 string argbackup = @"--host=localhost --port=5432 --username=admin -w --format=c --blobs --verbose --file=D:/abc abc"; ProcessStartInfo backupProcess = new ProcessStartInfo(); backupProcess.FileName = @"C:\Program Files\Postgresql\9.5\bin\pg_dump.exe"; backupProcess.Arguments = argbackup; backupProcess.UseShellExecute = false; backupProcess.RedirectStandardInput = true; backupProcess.RedirectStandardOutput = true; backupProcess.RedirectStandardError = true; backupProcess.CreateNoWindow = true; try { Process process = Process.Start(backupProcess); //在cmd中输出的成功的内容,重定向到result_success中 process.OutputDataReceived += (s,_e) => result_success += _e.Data; //在cmd中输出的成功的内容,重定向到result_error中 process.ErrorDataReceived += (s,_e) => result_error += _e.Data; //当EnableRaisingEvents为true,进程退出时Process会调用下面的委托函数 process.Exited += (s,_e) => Console.WriteLine("Exited with " + process.ExitCode); process.EnableRaisingEvents = true; process.BeginOutputReadLine(); process.BeginErrorReadLine(); process.WaitForExit(); process.Close(); } catch (Exception e) { Console.WriteLine(e.Message); }
在上面的代码中,增加了在IIS中将Process类在cmd中的输出内容输出到程序中的代码,但是,不知道postgresql的输出内容是怎么判断的,输出成功和失败的话都输出到error里了。
具体的可以看 .net Process类 输入输出重定向方法记录、Process.StandardOutput使用注意事项、C#输入输出重定向。 在IIS中选择部署好的C#工程,点击浏览网站,然后打开对应的C#程序,在菜单栏中点击调试——附加到进程,选择w3wp.exe,然后点击附加即可。如果有多个w3wp,只有一个一个试了,但类型应该是托管,可以在程序里打个断点,点了附加后,如果显示不能命中断点则说明不是这个进程。 在result_error处打断点可以看到输出的错误是没有输入密码。但是由于我没有找到在c#中向cmd中再次输入字符的方法,因此只能寻找不输入的方法,那么,就只有修改postgresql的权限,使用户可以不用输入密码就操作数据库。 我使用管理员登录IIS,网络为IPv6,则修改配置文件pg_hba.conf,将 IPv6 local connections的md5改为trust即可。如果是其他用户或网络,则修改相应的md5为trust。