У меня есть веб-приложение. NET Core MVC, которое имеет поле ввода, кнопку отправки и текстовую область вывода, которая (я надеюсь) делает именно то, что может делать командная строка.
Все Мне кажется, это хорошо, но у меня есть проблема в части View, когда я запускаю некоторые команды, для выполнения которых требуется время, особенно команда непрерывного пинга: ping 8.8.8.8 -t
. Представление не будет отображаться до тех пор, пока процесс не будет закрыт!
Есть ли способ заставить представление отображать вывод построчно, как командная строка, пока процесс еще запущен? Я думаю, что мне понадобится кнопка, чтобы остановить ее вручную.
Я очень новичок в этой области. Будем благодарны за любую помощь!
Вот мой Controller
:
[HttpPost]
public async Task<IActionResult> Index(HomeViewModel model)
{
ProcessStartInfo startInfo = new ProcessStartInfo()
{
WindowStyle = ProcessWindowStyle.Hidden,
FileName = "cmd.exe",
Arguments = @"/C " + model.InputCommand,
RedirectStandardOutput = true
};
Process process = new Process()
{
StartInfo = startInfo
};
try
{
process.Start();
Task task = await Task.Factory.StartNew(() => GetOutputAsync(process));
process.WaitForExit();
}
finally
{
if (!process.HasExited)
process.Close();
}
return View(model);
}
Мой GetOutputAsync
метод:
private async Task GetOutputAsync(Process process)
{
while (!process.StandardOutput.EndOfStream)
ViewData["Result"] += await process.StandardOutput.ReadLineAsync();
}
И, наконец, View
:
<style>
.break-line {
white-space: pre-line;
}
</style>
@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
<div class="input-group mb-3">
@Html.EditorFor(model => model.InputCommand, new { htmlAttributes = new { @type = "text", @class = "form-control" } })
<div class="input-group-append">
<input class="btn btn-outline-secondary" type="submit" value="Run" />
</div>
</div>
}
<div class="card text-white bg-dark mb-6">
<div class="card-header">Result</div>
<div class="card-body">
<p class="card-text break-line">@ViewData["Result"]</p>
</div>
</div>