ASP. Net MVC Просмотр веб-приложения в асинхронном режиме c с непрерывным пингом - PullRequest
0 голосов
/ 08 января 2020

У меня есть веб-приложение. 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>

1 Ответ

1 голос
/ 08 января 2020

Я подозреваю, что ваша проблема связана с Task task = await Task.Factory.StartNew (() => GetOutputAsyn c (process)) ;. Я полагаю, что он получит вывод, когда процесс остановится. Т.е. нет выхода до тех пор, пока пинг не будет остановлен программно. Я могу ошибаться Если бы я подходил к этому с хакерской точки зрения, я бы использовал «pint 8.8.8.8 -t >> log.txt», а затем проанализировал файл журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...