2013-07-03 45 views
2

是否可以執行服務器端程序並異步獲取輸出。與asp.net mvc4應用程序異步執行服務器端程序

我有這樣的代碼,這樣做的工作,但同步:

假設C#程序「的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"> 

EXCUTE控制器看起來是這樣的:

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); 
     } 
    } 
} 

這一切都工作正常,但...從客戶端必須等到程序結束顯示其輸出,是否有任何方法來獲得這些輸出,只要他們創建?

即時通訊我需要在控制器做一些變化,使其成爲可能,但如何?

回答

1

Asp.Net MVC的概念是Async Controller,它適合執行長時間運行的任務。它將幫助您在等待執行程序時不鎖定線程。

但是要做到你在做什麼後,我認爲你需要創建自己的Http Handler (probaby by implementing the IHttpHandler interface),它包裝過程並遞增返回結果。這不是微不足道的,但它應該是可能的。

第三個可行的替代方案可能是使用SignalR。這將是一個有趣的項目,但仍然需要我認爲很多工作。

+1

我想使用異步控制器或信號,我不知道* IHttpHandler *直到你提到它。 與異步控制器我有這個問題,如何發送異步響應的Ajax請求? 與signalr它想殺人的錯誤用火箭筒,我認爲它可以做的工作,但成本非常高。 – dafriskymonkey

+0

這應該是一個良好的開端,我想:http://msdn.microsoft.com/en-us/library/bb398986.aspx或者google :-) –

+0

但要知道,你正在嘗試做的是不平凡的。使用SignalR可能是最簡單的方法。 –

1

問題主要在於IIS主機進程和外部進程之間的通信。您需要促進某種排序的通信渠道,以將控制檯應用程序中的「進度」事件發送到ASP.NET應用程序。

WCF客戶端通過命名管道將信息發送到ASP.NET應用程序中託管的服務將使您能夠將消息發送到應用程序中。您可以在發出請求時託管服務,並動態生成管道名稱,以便與初始請求相關聯。

當您在應用程序中獲得更新後,您可以使用類似SignalR的東西來允許您將信息推回​​客戶端。

0

終於回來了一個答案(不完美,我想)。我用SignalR來完成這個任務。 我創建了一個messenger程序(用c#),它將成爲asp.net mvc4應用程序和任何顯示輸出的控制檯程序之間的橋樑。信使將執行該程序,然後將其輸出重定向到發送槽SignalR到客戶端。

如果您有興趣我在github上爲此創建了回購協議,請檢查此代碼here。我希望有一天它會幫助別人。

我很樂意與您討論此代碼。

相關問題