【问题标题】:Redirect command line output to MVC controller将命令行输出重定向到 MVC 控制器
【发布时间】: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


【解决方案1】:

我不确定您是否真的想将命令的输出作为对 Publish 的响应返回,但更改后的“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;
}

【讨论】:

  • 你能把代码的问题说清楚一点吗?
  • 是的,John Bartels,就是我想要的。我尝试按照您的示例进行操作,但结果始终为空。
猜你喜欢
  • 2013-11-14
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
相关资源
最近更新 更多