2

是否可以执行服务器端程序并异步获取输出。

我有这段代码可以同步完成这项工作:

假设 ac# 程序“program.exe”是这样的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace testconsole
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int k = 0; k < 10; k++ )Console.WriteLine(k);
        }
    }
}

asp.net 应用程序中的一些视图如下:

<script >
    function go()
    {
        var options = {
            url: '/excute',
            type: 'GET',
            dataType: 'json'
        }
        //make call
        $.ajax(options)
            .then(function (data) {
                console.log(data);
            });
    }
</script>

<input type="submit" onclick="go();" value="Go">

并且执行控制器看起来像这样:

namespace myApp.Controllers
{
    public class ExecuteController : Controller
    {
        //
        // GET: /Execute
        [HttpGet]
        public JsonResult Index()
        {
            Process p = new Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.FileName = "program.exe";
            p.Start();
            string output = p.StandardOutput.ReadToEnd();
            p.WaitForExit();
            return Json(new { op = output }, JsonRequestBehavior.AllowGet);
        }
    }
}

所有这一切都很好,但是......从客户端必须等到程序结束才能显示其输出,有没有办法在它们创建后立即获得这些输出?

我需要在控制器中进行一些更改以使其成为可能,但是如何?

4

3 回答 3

1

问题主要在于 IIS 主机进程和您的外部进程之间的通信。您需要促进某种通信渠道,以便将控制台应用程序的“进度”事件发送到 ASP.NET 应用程序。

WCF 客户端通过命名管道向托管在 ASP.NET 应用程序中的服务发送信息将使您能够将消息发送到应用程序。您将在发出请求时托管服务并动态生成管道名称,作为与初始请求相关联的一种方式。

在应用程序中获得更新后,您可以使用SignalR 之类的工具将信息推送回客户端。

于 2013-07-03T08:26:50.000 回答
1

Asp.Net MVC 具有适合执行长时间运行任务的异步控制器的概念。它将帮助您在等待程序执行时不锁定线程。

但是在我认为你需要创建自己的Http 处理程序(可能通过实现 IHttpHandler 接口)来包装流程并逐步返回结果之后,要做你想做的事情。这不会是微不足道的,但它应该是可能的。

第三种可行的替代方案可能是使用SignalR。那将是一个有趣的项目,但我认为仍然需要做很多工作。

于 2013-07-03T07:53:37.220 回答
0

我终于带着答案回来了(我想不完美)。我使用 SignalR 来完成这项工作。我创建了一个信使程序(使用 c#),它将成为 asp.net mvc4 应用程序和任何显示输出的控制台程序之间的桥梁。信使将执行程序,然后将他的输出重定向到通过 SignalR 发送到客户端。

如果您有兴趣,我已经在 github 上为此创建了一个 repo,请在此处查看此代码。我希望有一天它会对某人有所帮助。

我很乐意与您讨论此代码。

于 2013-07-14T00:53:45.167 回答