Рабочий фон ASP.NET Process.Start в диспетчере задач, но не активен в IIS8.5 (Windows 8.1)

я хочу выполнить файл .EXE в приложении mvc 3, когда мы запускаем этот проект локально в браузере, он работает отлично. Проблема в том, что когда мы публикуем этот проект и размещаем его на сервере IIS (8.5) в окне 8.1, когда мы нажимаем код кнопки, выполняемый и процесс запускается в диспетчере задач, но приложение не отображается спереди.
Например, в этом случае мы выполнить файл notepad.exe .
Ниже приведен наш код в html, мы делаем одну кнопку, когда пользователь нажимает на эту кнопку, метод контроллера вызывает этот код запуска.
когда пользователь нажимает на кнопку, это код, который выполняется.

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

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

    });

    event.preventDefault();
});

и запустите метод Start_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";

    }

Я хочу выполнить .EXE-файл с помощью iis (8.5) любого решения этой проблемы. я проверяю в Интернете, но не могу найти подходящего решения для этой проблемы.
я также проверяю эту ссылку, но не помогаю.
ASP.NET Process.Start не работает на IIS8 (Windows 8.1)


person Aqib Javed    schedule 04.12.2017    source источник
comment
Я бы предположил, что ваша проблема связана с разрешениями, но TBH может быть чем угодно. Зачем вам веб-страница, которая открывает блокнот на сервере? о_О Как-то бессмысленно   -  person Liam    schedule 04.12.2017
comment
Процесс, запускающий сайт в IIS, не предназначен для пользователя. Следовательно, вы не можете видеть это. Единственный способ, которым я мог это сделать, - написать отдельное приложение (консольное приложение, winforms, приложение в трее и т. д.), которое запускается как локальный пользователь и ожидает какого-либо сигнала. вы заставляете свое веб-приложение отправлять этот сигнал, затем консольное приложение запускает программу. Хотя я также должен отметить, что это кажется странным и не имеет особого смысла....   -  person GPW    schedule 04.12.2017
comment
Вот о чем следует подумать: - Что делать, когда несколько пользователей одновременно нажимают кнопку? Что вы делаете, когда один пользователь случайно нажимает кнопку более одного раза (контроллер не обязательно будет знать, что это один и тот же человек, если вы не добавите много кода) - что вы делаете, если приложение решает, что ему нужен пользовательский ввод (например, имеет ошибка, не хватает места на диске, автоматически обнаруживает доступное обновление и спрашивает пользователя, хотят ли они его, и т. д.). Расскажите нам, какую проблему, по вашему мнению, решит это «решение». Есть лучший способ, чем этот.   -  person GPW    schedule 04.12.2017
comment
@GPW, не могли бы вы рассказать мне подробнее, как мое веб-приложение будет отправлять сигнал настольному приложению для открытия exe-файла.   -  person Aqib Javed    schedule 04.12.2017
comment
Блокнот - это просто пример, я хочу открыть любой другой исполняемый файл. --@Лиам   -  person Aqib Javed    schedule 04.12.2017
comment
@AqibJaved может создать файл в папке, за которой следит приложение; он может использовать одну из многих систем очередей сообщений; он может прослушивать «пинг» на определенном TCP-порту; он может отслеживать таблицу в базе данных; есть много способов, которые могут работать. чего вы на самом деле пытаетесь достичь здесь?   -  person GPW    schedule 04.12.2017
comment
@GPW Я просто хочу открыть любое приложение, установленное на локальном компьютере. это может быть любая программа, такая как блокнот, блокнот, краска и т. д., просто помогите мне в этом отношении оставить оставшуюся цель приложения   -  person Aqib Javed    schedule 04.12.2017
comment
Это как раз то, что должно произойти. Узнайте об изоляции сеансов Windows, и тогда вы поймете, почему.   -  person Lex Li    schedule 05.12.2017


Ответы (2)


Хорошо, во-первых, это очень странная вещь - для любой вашей проблемы будет лучший подход. Тем не менее, что я сделал бы в этой ситуации:

  1. создать базу данных с таблицей JOB_QUEUE. что именно находится в этой таблице, зависит от вас, но я бы предложил идентификатор, date_added, что-то, указывающее, из чего должно состоять задание (например, имя исполняемого файла для запуска?) и флаг, чтобы указать статус задание (в ожидании/в процессе/не выполнено/завершено)
  2. изменить контроллер, чтобы вставить запись в эту таблицу со статусом «ожидание» (это ВСЕ, что он делает)
  3. написать отдельное приложение, которое запускается в пользовательском процессе (окна формы или консольное приложение). это приложение может работать на сервере, на котором размещен IIS, или на отдельном сервере - все, что ему нужно, это доступ к той же базе данных
  4. Сделайте так, чтобы это отдельное приложение периодически проверяло таблицу очереди заданий на наличие заданий со статусом ожидания.
  5. Когда обнаруживается новое задание, приложение обновляет базу данных, чтобы задание выполнялось, и запускает его. в случае успеха он обновляет задание как «завершенное», а в случае неудачи — как «неудачное».
  6. Затем он возвращается к простому наблюдению за таблицей.

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

person GPW    schedule 05.12.2017
comment
Для второго приложения, которое запускает файл .exe, мы размещаем это приложение на сервере iis или запускаем локально на компьютере. - person Aqib Javed; 05.12.2017
comment
Пока он может подключаться к базе данных, вы можете запускать его где угодно. Если вы работаете на сервере с IIS, вам нужно будет запустить его как вошедший в систему пользователь, поэтому подключитесь к серверу через удаленный рабочий стол или что-то в этом роде... Лично я бы разместил его на другом ПК. - person GPW; 05.12.2017

Для выполнения внешнего файла .exe в iis(8.5) и окне 8.1. мы использовали
Пользовательский протокол URL для вызова приложения. Технологии см. по этой ссылке
Пользовательский протокол URL
я изменил свою функцию Start_Appl на .

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()">  

Когда пользователь нажимает кнопку, вызывается функция LaunchURLScript, и внутри этой функции мы пишем в ней следующий код

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

        if (data = "ok") {
            alert("ok");
            var url = "myAppa:"; window.open(url); self.focus();
        }

    });

}  

ибо внутри мы сначала вызываем метод контроллера, чтобы создать протокол URl, если он еще не существует, и, наконец, мы открываем новое окно, которое запускает мой исполняемый файл блокнота.
таким образом мы решаем нашу проблему.

person Aqib Javed    schedule 11.12.2017