Выполнение командного файла в веб-сервисе C # - PullRequest
0 голосов
/ 14 августа 2011

Я пытаюсь выполнить командный файл в веб-службе C #. Я уверен, что пакетный файл не имеет проблем. Проблема, с которой я сталкиваюсь, заключается в том, что командный файл будет выполняться только в режиме отладки. Он не выдаст ошибку и не будет выполнен при подключении к клиентскому компьютеру. Я уверен, что нет ничего плохого в соединении, так как я могу успешно отправить что-то с клиента на веб-сервис.

Вот код:

        try
        {
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.StartInfo.FileName = "C:\\mybatch.bat";
            proc.StartInfo.UseShellExecute = true;
            proc.Start(); 

        }
        catch (Exception e)
        {
            return e.ToString();
        }

Visual Studio работает в режиме администратора, но cmd.exe работает в режиме (myUser), но я предоставил полный доступ каждому пользователю. Я не знаю, если это проблема или нет. Если нет, я должен добавить что-то в код? (

Скажите, пожалуйста, о возможных причинах проблемы и пути ее решения.

Ответы [ 3 ]

3 голосов
/ 14 августа 2011

Веб-служба не работает на «обычном рабочем столе» ... она имеет разные (= меньше) разрешения / права, например, они обычно не имеют доступа к общим ресурсам ... вы можете запустить веб-службу с вашей учетной записью пользователя (БОЛЬШАЯ угроза безопасности!) или должны пересмотреть ваш дизайн, так как запуск пакетных файлов из веб-сервисов обычно не то, что делают веб-сервисы ...

Если вам действительно нужно сделать это, попробуйте

ProcessStartInfo processInfo = new ProcessStartInfo(@"C:\mybatch.bat");
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
Process process = Process.Start(processInfo);
process.WaitForExit();
if(process.ExitCode==0){ // success}

см. http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.aspx

2 голосов
/ 14 августа 2011

Очень неприятно, когда что-то работает в режиме отладки, но не работает в Release! Чтобы разобраться в различиях времени выполнения, я хотел бы рассмотреть возможность использования бесплатного инструмента ProcMon от SysInternals: http://technet.microsoft.com/en-us/sysinternals/bb896645

Загрузите и запустите ProcMon для захвата всего реестра и доступа к файлам. Запустив его, откройте свой веб-сайт в режиме отладки и успешно запустите пакетный файл через веб-службу. В ProdMon прекратите захват (нажмите CTRL-E для запуска и остановки захвата) и нажмите CTRL-F для поиска «mybatch.bat».

Вы должны найти несколько строк - обратите внимание на связанный процесс (вероятно, «w3wp.exe») и обратите внимание на операцию, путь и результат каждой строки. Вы можете отфильтровать результаты - просто щелкните правой кнопкой мыши на имени процесса и выберите «Включить w3wp.exe».

Когда вы будете готовы увидеть случай сбоя выпуска, очистите трассировку (CTRL-X), переведите веб-сервер в режим выпуска и снова запустите трассировку. Теперь нажмите ваш веб-сервис ... как только он потерпит неудачу, остановите вашу трассировку (CTRL-C) и просмотрите ее, чтобы увидеть, что именно в случае сбоя. Как только вы это узнаете, вы сможете сосредоточиться на решении этой проблемы - особой разницы между отладкой и выпуском. Вероятно, ответ будет в документации, на которую указал Яхья: http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.aspx

Удачи и скажи использовать то, что найдешь!

0 голосов
/ 14 августа 2011

Как указывал Yahia выше, ваша проблема связана с разрешениями безопасности.При запуске через Debug в VS обычные разрешения вашей веб-службы повышаются.

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

Что касается использования связи между двумя братскими службами, я считаю, что у вас есть несколько вариантов.Первая, которая сразу появляется в моей голове, - это использование файлов, находящихся в общем месте.Когда WS получает запрос, он записывает этот запрос в файл на этом общем ресурсе.Служба Windows либо имеет таймер опроса для проверки новых заданий в этом месте, либо может использовать FileSystemWatcher для получения уведомлений о событиях.

...