【发布时间】:2014-12-26 14:22:22
【问题描述】:
我正在使用 MVC 和 C# 和 Visual Studio 2013 开发一个 Internet 应用程序。我需要实现一个能够自动登录网站的功能。为此,我使用了 CasperJs 框架。
以下代码创建了一个线程,将在命令行中执行 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()));
}
}
为了确保一切顺利,我想将命令行中产生的输出重定向到我的控制器。我怎么做?使用前面的代码,字符串输出始终为空。
【问题讨论】:
-
你想对输出做什么?您的代码是否成功地从
output变量中的外部进程收集了所需的信息?如果是这样,那么你不需要“重定向”任何东西,你在那个变量中有你需要的值。你想用这个值做什么? -
主要目标是确定登录是否正确。现在,我知道登录已经完成,因为当我直接在命令行中运行命令时,我正在打印页面的标题。我需要知道 mvc 控制器端的信息。我试图用输出字符串获取该信息,但它始终为空。
-
您的实现与 MSDN 建议的 (msdn.microsoft.com/en-us/library/…) 略有不同。也许尝试像在该示例中那样捕获流?老实说,这主要是一个猜测。你确定这个外部进程在标准输出中响应吗?这似乎与 MVC 没有任何关系,而只是在 C# 代码中捕获进程的输出。
-
老实说,我是 mvc、c# 和 jquery 的新手。我发现 CasperJS 可以做这种事情,并且我尝试在下面的示例中使用这个框架。但我还不明白如何将 CasperJS 之间的信息传递给我的控制器,以提供用户反馈。我有点困惑。
-
好吧,老实说,我什至不确定 CasperJS 是什么,而且我肯定不确定您为什么要使用外部进程来验证登录.这通常是应用程序在内部执行的操作。但需要明确的是,您面临的特定 问题是您正试图从外部进程(在
Process对象中)读取标准输出。它与 MVC 或 jQuery 无关。 (这个问题中的任何内容都与 jQuery 无关,我不确定您为什么提到这一点。)我对此没有答案,但希望能帮助您确定问题.
标签: c# visual-studio model-view-controller command-line casperjs