ASP.NET работает EXE-файл - PullRequest
0 голосов
/ 24 июня 2009

Я пытаюсь запустить старое приложение .NET с веб-сайта ASP.NET. После прочтения Интернета и Stackoverflow (для аналогичной проблемы) я пришел к следующему коду. Проблема в том, что я всегда получаю код ошибки (я использую учетную запись администратора только для целей тестирования). Если я запускаю exe вручную, он работает нормально.

private void Execute(string sPath)
{
    System.Diagnostics.Process proc = new System.Diagnostics.Process();
    proc.StartInfo.UserName = "administrador";
    string pass = ".............";

    System.Security.SecureString secret = new System.Security.SecureString();
    foreach (char c in pass) secret.AppendChar(c);

    proc.StartInfo.Password = secret;
    proc.StartInfo.WorkingDirectory = ConfigurationManager.AppSettings["WORKINGDIRECTORY"].ToString();
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.RedirectStandardError = true;
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.FileName = sPath;
    proc.Start();
    proc.WaitForExit();
    string result = proc.StandardOutput.ReadToEnd();
    Response.Write(result + " - "  + proc.ExitCode);
    proc.Close();
}

}

Код выхода, который я получаю: -1066598274 Переменная результата пуста. Не исключение брошено Я использую Windows 2008 с IIS 7.0

Заранее спасибо,

Ezequiel

Ответы [ 8 ]

4 голосов
/ 24 июня 2009

Не делай этого. Это просто грязно и не должно быть сделано из ASP.NET

  1. Написать службу Windows
  2. Хранить запрос в очереди
  3. Служба должна опросить очередь и обработать. При необходимости запустите exe. Предполагается, что служба находится на другом сервере.

Не делай этого. Это очень плохо и не масштабируется и плохо для веб-сервера

Не

Не

Не

2 голосов
/ 13 сентября 2014
    protected void btnSubmit_Click(object sender, System.EventArgs e)
    {
        if (Page.IsValid)
        {
            litMessage.Visible = true;

            System.Diagnostics.Process oProcess = null;

            try
            {
                string strRootRelativePathName = "~/Application.exe";

                string strPathName =
                    Server.MapPath(strRootRelativePathName);

                if (System.IO.File.Exists(strPathName) == false)
                {
                    litMessage.Text = "Error: File Not Found!";
                }
                else
                {
                    oProcess =
                        new System.Diagnostics.Process();

                    oProcess.StartInfo.Arguments = "args";

                    oProcess.StartInfo.FileName = strPathName;

                    oProcess.Start();

                    oProcess.WaitForExit();

                    System.Threading.Thread.Sleep(20000);

                    litMessage.Text = "Application Executed Successfully...";
                }
            }
            catch (System.Exception ex)
            {
                litMessage.Text =
                    string.Format("Error: {0}", ex.Message);
            }
            finally
            {
                if (oProcess != null)
                {
                    oProcess.Close();
                    oProcess.Dispose();
                    oProcess = null;
                }
            }
        }
    }
1 голос
/ 23 июля 2012

Что я делаю, так это чтобы исполняемый файл вызывался заданием ms sql. Исполняемый файл будет запущен как учетная запись службы агента сервера SQL.

  1. Создание нового задания сервера sql
  2. Дайте ему имя на общей странице свойства задания
  3. На странице шагов создайте новый шаг типа Операционная система (CmdExec)
  4. Введите команду и нажмите ОК, чтобы сохранить параметры задания

Новое задание можно вызвать с помощью EXEC msdb.dbo.sp_start_job @jobname, где @jobname - переменная, содержащая название задания, которое вы хотите запустить.

Обратите внимание, что при запуске этого задания пользовательский интерфейс exe будет скрыт и не будет отображаться; но вы можете найти его в диспетчере задач.

Я использовал этот метод в нескольких приложениях, особенно трудоемких операциях, которые невозможно выполнить на веб-странице.

1 голос
/ 25 июня 2009

Если приложение, которое вы пытаетесь запустить, действительно является приложением .NET, как вы говорите, вам, возможно, вообще не понадобится запускать его в отдельном процессе. Вместо этого вы можете воспользоваться тем, что исполняемые файлы .NET также являются сборками. Я не думаю, что Visual Studio позволит вам ссылаться на сборки, заканчивающиеся на .exe, но компилятор командной строки будет.

Я бы попытался использовать компилятор командной строки для создания сборки-оболочки, которая просто ссылается на исполняемую сборку и напрямую вызывает ее метод Main (), передавая строковый массив любых параметров командной строки, которые вы обычно определяете. Код выхода, если он есть, будет целочисленным возвращаемым значением из метода Main. Затем вы можете просто вызвать сборку оболочки из приложения ASP.NET.

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

1 голос
/ 24 июня 2009

Вам нужно изменить порядок вывода результатов в конце.

Ожидается, что вы прочитаете перед вызовом waitforexit (), поэтому вы должны иметь:

proc.Start(); <strong>string result = proc.StandardOutput.ReadToEnd(); Response.Write(result + " - " + proc.ExitCode); proc.WaitForExit();</strong> proc.Close();

1 голос
/ 24 июня 2009

Если вы используете

proc.StartInfo.RedirectStandardOutput = true;

тогда вы должны читать поток по мере выполнения процесса, а не перед вызовом

proc.WaitForExit();

То же самое касается стандартного потока ошибок. См. MSDN документы для более подробной информации.

0 голосов
/ 31 января 2012

Используйте код ниже:

    ProcessStartInfo info = new ProcessStartInfo("D:\\My\\notepad.exe");
    info.UseShellExecute = false;
    info.RedirectStandardInput = true;
    info.RedirectStandardError = true;
    info.RedirectStandardOutput = true;
    //info.UserName = dialog.User;   
    info.UserName = "xyz";
    string pass = "xyz";
    System.Security.SecureString secret = new System.Security.SecureString();
    foreach (char c in pass)
        secret.AppendChar(c);
    info.Password = secret;
    using (Process install = Process.Start(info))
    {
        string output = install.StandardOutput.ReadToEnd();
        install.WaitForExit();
        // Do something with you output data          
        Console.WriteLine(output);
    }
0 голосов
/ 24 июня 2009

Может потребоваться установить для свойства proc.StartInfo.LoadUserProfile значение true, чтобы содержимое профиля пользователя администратора загружалось в реестр (по умолчанию это не происходит).

Кроме того, может быть полезно запустить программу «Здравствуй, мир», чтобы увидеть, связана ли проблема с созданием процесса на самом деле или с самим процессом возникают проблемы при выполнении в заданном контексте.

Наконец, в качестве шага в попытке выяснить, где может быть проблема, вы можете запустить сам процесс ASP.NET с учетными данными администратора или системы, чтобы проверить, есть ли что-то в разрешениях учетной записи экземпляра ASP.NET. является частью проблемы (но, пожалуйста, делайте это только для устранения неполадок).

...