0

我正在开发一个使用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去正确的,我想重定向在命令行中我的控制器所产生的输出。我怎么做?使用前面的代码,字符串输出始终为空。

+2

什么是你想要做的输出?您的代码是否成功地从'output'变量中的外部进程收集了它所需的信息?如果是这样,那么你不需要“重定向”任何东西,你有这个变量所需的价值。你想用这个价值做什么? – David

+0

主要目标是确保登录是否正确完成。现在,我知道登录完成了,因为当我直接在命令行中运行命令时,我正在打印页面的标题。我需要在mvc控制器端知道这些信息。我试图用输出字符串获取该信息,但它始终为空。 –

+0

你的实现与MSDN建议的有点不同(http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput%28v=vs.110%29.aspx)。也许尝试捕获像该样本中的流?说实话,这大多是一种猜测。你确定这个外部过程在标准输出中响应吗?这似乎与MVC没有任何关系,只是捕获了C#代码中的进程输出。 – David

回答

0

我不确定您是否想要将命令的输出作为对发布的响应返回,但更改后的'ExecuteCommand'方法应该有助于从进程获取标准输出。从那里,你可以根据可能包含在该输出中的期望值来做你喜欢的事情。

[HttpPost] 
public ActionResult Publish() 
{ 
    try 
    { 
     string cmdResult = ""; 
     new Thread(new ParameterizedThreadStart(x => 
     { 
      cmdResult = ExecuteCommand("casperjs test.js"); 
     })).Start(); 

     var response = Request.CreateResponse<string>(System.Net.HttpStatusCode.OK, cmdResult); 
     return response; 
    } 
    catch (Exception e) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest, e.Message); 
    } 
} 

private string ExecuteCommand(string Command) 
{ 
    string result = ""; 
    try 
    { 
     ProcessStartInfo processInfo = new ProcessStartInfo("cmd.exe", "/K " + Command); 

     processInfo.CreateNoWindow = true; 
     processInfo.UseShellExecute = false; 
     processInfo.RedirectStandardOutput = true; 
     processInfo.RedirectStandardError = true; 

     Process process = Process.Start(processInfo); 
     process.WaitForExit(); 

     while (!process.StandardOutput.EndOfStream) 
     { 
      result += process.StandardOutput.ReadLine(); 
     } 

     while (!process.StandardError.EndOfStream) 
     { 
      result += process.StandardError.ReadLine(); 
     } 
    } 
    catch (Exception e) 
    { 
     Trace.Listeners.Add(new TextWriterTraceListener(e.ToString())); 
     throw; 
    } 

    return result; 
} 
+0

你可以让它更清楚一点,代码的问题是什么? –

+0

是约翰巴特尔斯,是我想要的。我试图按照你的例子,但结果总是空的。 –

相关问题