在 asp.net 中实时显示命令行程序的输出

Posted

技术标签:

【中文标题】在 asp.net 中实时显示命令行程序的输出【英文标题】:Display output from command line program realtime in asp.net 【发布时间】:2012-10-16 10:33:22 【问题描述】:

我正在编写一个 Web 应用程序,该应用程序使用 System.Diagnostics 类在系统上运行命令。 我想显示命令的实时输出,这需要很长时间才能完成。经过一番搜索,我发现 BeginOutputReadLine 可以将输出流式传输到事件处理程序。

我也在使用 jquery ajax 来调用这个方法并让进程异步运行。 到目前为止,我正在尝试这样做:

Process p2= new Process(); p2.OutputDataReceived += new DataReceivedEventHandler(opHandler); p2= Process.Start (psi2); p2.BeginOutputReadLine();

我已经声明了一个带有静态变量的类,以将命令的输出存储为页面上的标签,不能从静态方法访问。

public class ProcessOutput

    public static string strOutput;

    [WebMethod]
    public static string getOutput()
    
        return strOutput;
    

在 BeginOutputReadLine 的事件处理程序中,将变量设置为输出中的行。

private static void opHandler(object sendingProcess,DataReceivedEventArgs outLine)
    
        if (!String.IsNullOrEmpty(outLine.Data))
        
            ProcessOutput.strOutput= outLine.Data;  
        
    

从aspx页面,我调用方法来获取strOutput的值

    $(document).ready(function() 

setInterval(function()  
  $.ajax(
   type: "GET",
   url: "newscan.aspx/getOutput",
   data: "",
   success: function(msg)
     $('#txtAsyncOp').append(msg.d);
   
 );
, 1000);

);     

我不知道为什么,但是标签没有更新。如果我发出警报,我每 10 秒就会在警报框中得到“未定义”。 谁能建议我如何正确地做到这一点?

【问题讨论】:

你能解决你的问题吗?请告诉我;如果是,请标记为已回答 - 非常感谢! :) 【参考方案1】:

作为请求管道的一部分,每个请求都会开始一个新线程。这是设计使然。每个线程都有自己的堆栈,并且不能访问彼此的堆栈。当一个线程开始运行一个新方法时,它将该方法中的参数和局部变量存储在它自己的堆栈上。长话短说,您将无法分配该变量并期望从另一个请求中检索其值。

您可以采取几种方法,您可以将其范围限定为会话变量(最常见):

System.Web.HttpContext.Current.Session["variable"]  = value ; 

或者您使用以下方法将其设置为应用程序范围:

if (System.Web.Caching.Cache["Key1"] == null)
      System.Web.Caching.Cache.Add("Key1", "Value 1", null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration, CacheItemPriority.High, onRemove);

或者,您可以将输出记录到数据库或文件并通过 WebMethod 回显结果。如果您的长时间运行的进程是异步运行的,您将无法访问 HttpContext——因此 Session 状态包将不可用;可以使用应用程序缓存,但它通常不用于这种类型的机制(缓存是出于性能原因,而不是持久性机制 - 重要的是要记住您无法控制 Web 应用程序何时回收)。

我强烈建议写入数据库或日志文件。异步过程通常需要记录输出或跟踪来诊断潜在问题并验证结果。

此外,由于您无法控制 Web 应用程序何时回收,您很容易失去对正在启动的子进程的控制。更好的设计是启动一个asynchronous method in-process,或者一个进程外的应用程序或服务,轮询数据库以获取作业(可能使用任务调度程序或cron,具体取决于您的平台)。

【讨论】:

以上是关于在 asp.net 中实时显示命令行程序的输出的主要内容,如果未能解决你的问题,请参考以下文章

使用命令行如何在 ASP.NET 中首先从 DB 搭建脚手架 - 而不是 ASP.NET Core MVC?

命令行应用程序中的 asp.net 4.0 到 excel 2010 不起作用 - 即使在驱动程序安装后也找不到驱动程序

ASP.NET中Web网页的退出命令是啥?

将数组作为命令行参数传递给 Asp.Net Core

在 textBrowser 中实时显示 QProcess 输出

如何使用 ASP.NET Core 显示错误