【问题标题】:Launch external process (.exe) from asp.net core app从 asp.net 核心应用程序启动外部进程 (.exe)
【发布时间】:2018-01-17 08:28:58
【问题描述】:

我有以下

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

【问题讨论】:

  • 运行外部应用需要哪些权限?
  • 这里的部分问题是 Calc。当一切顺利时,UWP calc 随之而来,并且您无法从非交互式会话(如应用程序池开始的会话)启动 UWP 进程。那么......它是否适用于您尝试开始的实际过程? (并不是说我会以任何方式鼓励这样做)

标签: iis asp.net-core asp.net-core-mvc asp.net-core-2.0 kestrel-http-server


【解决方案1】:

首先,像这样启动外部进程是一个非常糟糕的主意。所以请不要在实际应用程序中这样做。您很可能会产生更多值得的问题和安全漏洞。有几种更强大的架构模式可用于处理请求管道之外的外部进程。

也就是说,这里的问题是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();
}

【讨论】:

  • '有几种更强大的架构模式可用于处理请求管道之外的外部进程。'你能说出一两个吗?
  • 这取决于过程。一般来说,我倾向于Scheduler Agent SupervisorCompeting Consumers 的变体。要点是您的主进程只对外部进程运行的请求进行排队,而不是直接依赖它。
  • @MarcLaFleur 有实际实现的链接吗?我理解这个概念,但我不确定如何在现实生活中使用它来实际启动一个 exe..
【解决方案2】:

AzureWebJob 就是其中一种实现,虽然没有那么简单,但它可以完成工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 2013-08-22
    • 2018-05-14
    • 2010-09-19
    • 1970-01-01
    相关资源
    最近更新 更多