我正在开发一个使用MVC和C#的Visual Studio 2013互联网应用程序。我需要实现一个功能,以便能够在网站中自动登录。为此,我使用CasperJs框架。将命令行输出重定向到MVC控制器
以下代码创建一个将在命令行中执行js代码的线程。
[HttpPost]
public ActionResult Publish()
{
try
{
new Thread(new ParameterizedThreadStart(x =>
{
ExecuteCommand("casperjs test.js");
})).Start();
return new HttpStatusCodeResult(HttpStatusCode.OK);
}
catch (Exception e)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest, e.Message);
}
}
private void ExecuteCommand(string Command)
{
try
{
ProcessStartInfo processInfo = new ProcessStartInfo("cmd.exe", "/K " + Command);
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
processInfo.RedirectStandardOutput = true;
Process process = Process.Start(processInfo);
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
}
catch (Exception e)
{
Trace.Listeners.Add(new TextWriterTraceListener(e.ToString()));
}
}
要确保eveything去正确的,我想重定向在命令行中我的控制器所产生的输出。我怎么做?使用前面的代码,字符串输出始终为空。
什么是你想要做的输出?您的代码是否成功地从'output'变量中的外部进程收集了它所需的信息?如果是这样,那么你不需要“重定向”任何东西,你有这个变量所需的价值。你想用这个价值做什么? – David
主要目标是确保登录是否正确完成。现在,我知道登录完成了,因为当我直接在命令行中运行命令时,我正在打印页面的标题。我需要在mvc控制器端知道这些信息。我试图用输出字符串获取该信息,但它始终为空。 –
你的实现与MSDN建议的有点不同(http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput%28v=vs.110%29.aspx)。也许尝试捕获像该样本中的流?说实话,这大多是一种猜测。你确定这个外部过程在标准输出中响应吗?这似乎与MVC没有任何关系,只是捕获了C#代码中的进程输出。 – David