我所希望做的是:流控制檯應用程序的標準輸出到一個ASP.NET MVC視圖
1)從一個MVC視圖,啓動一個長期運行的進程。就我而言,這個過程是一個獨立的控制檯應用程序正在執行。控制檯應用程序可能運行30分鐘,並正在進行Console.Write的當前操作。
2)回到MVC視圖,定期輪詢服務器以檢索我已重定向到Stream(或任何我可以訪問它的任何地方)的最新Standard Out。我會將新的retieved標準輸出附加到日誌文本框或其他相當的東西。
聽起來相對容易。儘管我的客戶端編程有點生疏,但我遇到了實際流媒體問題。我會認爲這不是一項不常見的任務。任何人都可以在ASP.NET MVC中獲得體面的解決方案嗎?
最大的問題似乎是,我不能得到StandardOutput直到執行結束,但我能夠得到它與事件處理程序。當然,使用事件處理程序似乎失去了我輸出的重點。
這是我與迄今的工作...
public ActionResult ProcessImport()
{
// Get the file path of your Application (exe)
var importApplicationFilePath = ConfigurationManager.AppSettings["ImportApplicationFilePath"];
var info = new ProcessStartInfo
{
FileName = importApplicationFilePath,
RedirectStandardError = true,
RedirectStandardInput = true,
RedirectStandardOutput = true,
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = false
};
_process = Process.Start(info);
_process.BeginOutputReadLine();
_process.OutputDataReceived += new DataReceivedEventHandler(_process_OutputDataReceived);
_process.WaitForExit(1);
Session["pid"] = _process.Id;
return Json(new { success = true }, JsonRequestBehavior.AllowGet);
}
void _process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
_importStandardOutputBuilder.Insert(0, e.Data);
}
public ActionResult Update()
{
//var pid = (int)Session["pid"];
//_process = Process.GetProcessById(pid);
var newOutput = _importStandardOutputBuilder.ToString();
_importStandardOutputBuilder.Clear();
//return View("Index", new { Text = _process.StandardOutput.ReadToEnd() });
return Json(new { output = newOutput }, "text/html");
}
我沒有寫客戶端代碼卻因爲我只是擊中URL測試行動,但我也有興趣你將如何處理這個文本的輪詢。如果你也可以提供這個實際的代碼,那就太好了。我會假設你將有一個js循環在開始使用ajax調用服務器的過程之後運行,該服務器返回JSON結果......但是,它不是我的特長,所以很想看看它是如何完成的。
謝謝!
這是一個很好的基礎解決方案。我在自己的代碼中使用它作爲jumpboard,在那裏我必須解決「靜態方法」,因爲我必須假設我的網站被多個用戶同時使用,並且每個用戶都可以運行一個進程時間。所以控制器中的靜態過程對象不會爲我做。因此我寫了一個圍繞Process類的封裝,我以鬆散耦合的方式將其放入用戶會話狀態(參見http://josephwoodward.co.uk/2014/06/sessions-asp-net-mvc-using-dependency -注射/)。 –