Запустить внешний процесс (.exe) из основного приложения asp.net

У меня есть следующие

[HttpPost]
public IActionResult LaunchExternalProcess()
{
    Process.Start("C:\\Windows\\System32\\calc.exe");
    return Ok();

}

И это отлично работает на моем локальном компьютере, но при развертывании на IIS 10 (Windows 2016) я не получаю ошибок, но калькулятор на сервере не запускается.

Я просто хочу вызвать внешний .exe с помощью кнопки на моей странице.

Вот javascript, который я использую, который также работает на моем локальном компьютере, но без ошибок на сервере и отображает сообщение об успешном завершении.

$.ajax({
    url: "/Admin/LaunchExternalProcess",
    type: "POST",
    cache: false,

    success: function () {

        console.log("success");
    }
});

person Zoinky    schedule 17.01.2018    source источник
comment
какие разрешения потребуются для запуска внешнего приложения?   -  person Zoinky    schedule 17.01.2018
comment
Отчасти проблема здесь в Calc. Когда все прошло, UWP calc пошел вместе с ним, и вы не можете запустить процесс UWP из неинтерактивного сеанса, такого как тот, из которого запускается пул приложений. Итак ... работает ли это с фактическим процессом, который вы пытаетесь запустить? (Не то чтобы я хоть как-то поощрял это)   -  person blowdart    schedule 17.01.2018


Ответы (2)


Во-первых, запускать такой внешний процесс - очень плохая идея. Поэтому, пожалуйста, не делайте этого в реальном приложении. Скорее всего, вы создадите гораздо больше проблем и дыр в безопасности, которых это когда-либо стоило бы. Существует несколько гораздо более надежных архитектурных шаблонов для работы с внешними процессами за пределами вашего конвейера запросов.

Тем не менее, проблема в том, что calc.exe не запускается на вашем сервере. Однако ваш метод не знает об этом, поскольку вы просто говорите ему запустить Process, вы не проверяете, в каком состоянии находится этот процесс.

var process = Process.Start("C:\\Windows\\System32\\calc.exe");
if (process == null) // failed to start
{
    return InternalServerError();
}
else // Started, wait for it to finish
{
    process.WaitForExit();
    return Ok();
}
person Marc LaFleur    schedule 14.02.2018
comment
«Существует несколько гораздо более надежных архитектурных шаблонов для работы с внешними процессами за пределами вашего конвейера запросов». Вы можете назвать одного или двух? - person Riscie; 16.03.2018
comment
Это зависит от процесса. Как правило, я склоняюсь к варианту диспетчера агента планировщика или Конкурирующие потребители. Суть в том, что ваш основной процесс только ставит в очередь запрос на запуск внешнего процесса, а не напрямую зависит от него. - person Marc LaFleur; 16.03.2018
comment
@MarcLaFleur Есть ссылки на фактические реализации? Я понимаю эту концепцию, но не уверен, как я могу использовать ее в реальной жизни, чтобы запустить exe .. - person Inception; 22.10.2020

AzureWebJob - одна из таких реализаций, не такая простая, но она выполняет свою работу.

person Thomas Nielsen    schedule 03.04.2021