C# ASP.NET进程。在任务管理器中启动后台工作,但在IIS8.5(Windows 8.1)中不在前台

C# ASP.NET进程。在任务管理器中启动后台工作,但在IIS8.5(Windows 8.1)中不在前台,c#,asp.net-mvc,iis,process,iis-8.5,C#,Asp.net Mvc,Iis,Process,Iis 8.5,我想在mvc 3应用程序中执行一个.EXE文件,当我们在浏览器上本地运行此项目时,它可以完美地工作。问题是,当我们发布此项目并将其托管在Windows 8.1上的IIS(8.5)服务器上时,单击“任务管理器”中的“已执行代码”按钮并处理“启动”,但应用程序未显示在前面。 例如,在本例中,我们执行notepad.exe文件。 下面是我们在html中的代码,当用户单击该按钮时,我们会生成一个按钮,该按钮控制器方法称为运行代码。 当用户点击按钮时,这是执行的cod $("#Button11").cl

我想在mvc 3应用程序中执行一个.EXE文件,当我们在浏览器上本地运行此项目时,它可以完美地工作。问题是,当我们发布此项目并将其托管在Windows 8.1上的IIS(8.5)服务器上时,单击“任务管理器”中的“已执行代码”按钮并处理“启动”,但应用程序未显示在前面。
例如,在本例中,我们执行notepad.exe文件。
下面是我们在html中的代码,当用户单击该按钮时,我们会生成一个按钮,该按钮控制器方法称为运行代码。
当用户点击按钮时,这是执行的cod

 $("#Button11").click(function (event) {

    $.post("/Account/Start_Appl", {}, function (data) {

    });

    event.preventDefault();
});
帐户控制器内的startstart\u Appl方法具有以下代码行

 public string Start_Appl()
    {    string path="C:\\Windows\\System32\\notepad.exe";
         ProcessStartInfo psi = new ProcessStartInfo();
         psi.UseShellExecute = true;
         psi.LoadUserProfile = true;
         psi.WorkingDirectory = path;
         psi.FileName = path;

         Process.Start(psi);


        return "ok";

    }
我想用iis(8.5)执行.EXE文件来解决这个问题。 我在网上查过,但找不到解决这个问题的合适方法。
我也会查看此链接,但不会提供任何帮助。

好的,首先,这是一件非常奇怪的事情——不管你的问题是什么,都会有更好的方法。也就是说,在这种情况下,我要做的是:

  • 使用作业队列表创建数据库。此表中的具体内容由您决定,但我建议您提供一个ID、一个添加的日期、一个指示作业应包含哪些内容的内容(例如,要运行的exe的名称?)以及一个指示作业状态的标志(挂起/进行中/失败/完成)
  • 修改控制器以将状态为“挂起”的记录插入此表(仅此而已)
  • 编写在用户进程中运行的单独应用程序(windows窗体或控制台应用程序)。此应用程序可以在承载IIS的服务器上运行,也可以在单独的服务器上运行—它需要访问同一数据库
  • 使此单独的应用程序定期检查作业队列表中具有挂起状态的作业
  • 当检测到新作业时,应用程序将更新数据库,使作业处于“进行中”状态并运行作业。如果成功,则将作业更新为“已完成”,如果失败,则将作业更新为“失败”
  • 然后,它返回到简单地监视表

  • 有很多其他东西可以用来代替队列中的数据库,但这样可以快速编写,易于调试/测试,并且可以轻松添加多个客户端和保存历史信息,并添加控制器方法来报告请求/完成的作业和进度。

    用于在iis(8.5)中执行外部.exe文件窗口8.1。我们使用了
    调用应用程序的自定义URL协议技术检查此链接

    我已将我的启动应用程序更改为

    public string Start_Appl()
        {
            try
            {
    
                string myAppPath = "C:\\Windows\\System32\\notepad.exe";
    
                RegistryKey key = Registry.ClassesRoot.OpenSubKey("myAppa");  //open myApp protocol's subkey
    
                if (key == null)  //if the protocol is not registered yet...we register it
                {
                    key = Registry.ClassesRoot.CreateSubKey("myAppa");
                    key.SetValue(string.Empty, "URL: myApp Protocol");
                    key.SetValue("URL Protocol", string.Empty);
    
                    key = key.CreateSubKey(@"shell\open\command");
                    key.SetValue(string.Empty, myAppPath + " " + "%1");
    
                }
    
                key.Close();
    
            }
            catch (Exception e) {
                return e.Message.ToString();
            }
    
    
    
            return "ok";
    
        }
    
    我们首先注册一个键,如果它还没有创建和设置值,然后我们在我的aspx页面上创建一个按钮,如下所示

      <input type="submit" name="Launch" id="Launch" value="Launch Custom URL" onclick="LaunchURLScript()">  
    
    对于inside,我们首先调用控制器方法来创建URl协议(如果还不存在的话),最后我们打开一个新窗口来创建我的便笺簿exe文件。

    这样我们就解决了问题。

    我想你的问题是权限,但它可能是任何东西。为什么需要在服务器上打开记事本的网页?o_o似乎毫无意义在IIS中运行站点的进程不是面向用户的进程。因此你看不见它。我能想到的唯一方法是编写一个单独的应用程序(控制台应用程序、winforms、托盘应用程序等),作为本地用户运行并等待某种信号。你让你的网络应用发送这个信号,然后控制台应用启动程序。虽然我也必须指出,这似乎是一件奇怪的事情,没有太多的意义…一些事情需要考虑:-当多个用户同时按下按钮时,你会怎么做?当一个用户不小心按下按钮不止一次时,你会怎么做(除非你添加了很多代码,否则控制器不一定知道是同一个人)-如果应用程序决定需要用户输入,你会怎么做(例如,出现错误、磁盘空间不足、自动检测可用更新并询问用户是否需要更新等)..告诉我们您认为此“解决方案”将解决什么问题。有比此更好的方法。@GPW您能告诉我一些详细信息吗?我的web应用程序将如何向桌面应用程序发送信号以打开exe文件。注意,pad只是我想打开任何其他exe文件的一个示例。-@liam对于启动.exe文件的第二个应用程序,我们将该应用程序托管在iis服务器上或者在本地计算机上运行。只要它可以连接到数据库,你就可以在任何地方运行它。如果在运行IIS的服务器上运行,尽管你需要以登录用户的身份运行它,但是-因此,通过远程桌面或其他方式连接到服务器…我个人会在另一台PC上运行它。
      function LaunchURLScript() {
        $.post("/Account/Start_Appl", {}, function (data) {
    
            if (data = "ok") {
                alert("ok");
                var url = "myAppa:"; window.open(url); self.focus();
            }
    
        });
    
    }