2012-01-04 2 views
1

У меня есть сценарий powershell, который запускает консольное приложение .exe. Консольное приложение запускает веб-службу. Для выполнения задачи веб-служба занимает около 10 минут.Тайм-аут скрипта Powershell после 130 секунд

В производственной среде сценарий powershell заканчивается примерно через 130 секунд, а задача веб-службы завершается. Это основная проблема! Все хорошо работает в локальной среде.

Powershell version 2 работает как на местном уровне, так и на производстве.

При запуске скрипта powershell с консоли. Локально сценарий powershell выводит возвращаемое значение консольного приложения. В производстве ничего не печатается на экране. Он просто отображает новую командную строку.

Задача может быть выполнена как можно быстрее с веб-страницы в производственной среде.

Все прикладные коды/файлы конфигурации одинаковы как в локальной, так и в производственной среде.

Единственное, что имеет смысл, это сценарий powershell, который выдает время и заканчивает консольное приложение, которое, в свою очередь, завершает работу веб-службы.

Исследуйте тайм-ауты powershell и сыграли с разными сценариями. Но тот факт, что он работает локально, как представляется, указывает на проблему с настройкой по умолчанию для powershell.

Эта страница описывает параметры времени ожидания: http://www.ehow.com/how_12026004_set-timeout-powershell.html

Но работает: Dir WSMan: \ локальный \ Результаты оболочки в пути не найдена ошибка при запуске в производство.

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

# attempt to exe file. iex is an alias for the invoke-expression cmd 
iex "Reminder.exe" 

$smtpServer = "" 
$fromAddress = "" 
$toAddress = "" 
$subject = "SUCCESS" 
$msgBody = "" 

# $? lets us know if the previous command was successful or not 
# $LASTEXITCODE gives us the exit code of the last Win32 exe execution 
if (!$? -OR $LASTEXITCODE -gt 0) 
{ 
$subject = "FAIL" 
} 

$smtpClient = new-object Net.Mail.SmtpClient($smtpServer) 
$smtpClient.Credentials = $senderCreds 
$smtpClient.Send($fromAddress,$toAddress,$subject,$msgBody) 
+2

Одно следует отметить, вы должны использовать '&' для вызова программы Win32 вместо 'Invoke-Expression', такие как' & reminder.exe'. Дополнительную информацию см. В блоге Windows PowerShell о 'Invoke-Expression' [здесь] (http://blogs.msdn.com/b/powershell/archive/2011/06/03/invoke-expression-considered-harmful.aspx) , –

+0

Чтобы уточнить, 'reminder.exe' - ваше консольное приложение, которое запускает веб-службу, правильно? Также вы могли бы более подробно описать разницу между производственной средой и вашей локальной средой с точки зрения того, как вы вызываете скрипт? Используете ли вы PowerShell для удаленного запуска сценария в производственной системе? –

+0

Correct - reminder.exe - это консольное приложение, которое запускает веб-сервер. Нет никаких различий, которые я знаю между местными и производственными. Локальный - это поле Windows Server 2008 R2, используемое для локальной разработки. Сервер производства тот же. Скрипт powershell просто запускается из командной строки powershell (для целей тестирования). Пробовал $, но не смог получить синтаксис вправо. На самом деле reminder.exe имеет полный путь с пробелами. Можете ли вы дать быстрый пример? –

ответ

0

Я сделал неправильное предположение здесь. Сценарий powershell не возвращал результаты консольного приложения. Не удалось выполнить консольное приложение. Но поскольку сценарий выводит «0», я предположил, что он был успешным (как возвращается консольным приложением). Добавление следующей строки в скрипт Powershell возвращается фактическое возвращаемое значение:

Write-Host "CONSOLEEXITCODE : $LASTEXITCODE" 

Теперь, когда стало ясно, что консольное приложение терпело неудачу и не сценарий Powershell (как доказано тестом умного пинга предложил) я добавил консоль .WriteLine, чтобы записать ошибку (в командное окно powershell):

Тип контента text/html; charset = utf-8 ответного сообщения не соответствует типу содержимого привязки (text/xml; charset = utf-8). Если вы используете пользовательский кодер, убедитесь, что метод IsContentTypeSuppor применяется правильно.

Это привело меня к дикой гусиной погоне. До тех пор, пока я не поймал и не зарегистрировал все ошибки веб-службы и задачи, я обнаружил следующую ошибку в задаче:

Тема прерывалась.

Исправление было так просто, как увеличение «нить» тайм-аут:

HttpContext.Current.Server.ScriptTimeout = 900; // in seconds 

Лучшим решением может быть запуск этого асинхронно в отдельном потоке.

Это список тайм-аутов, необходимых для работы этого процесса. Код будет конечно меняться в зависимости от языка/реализации:

C# Task: HttpContext.Current.Server.ScriptTimeout = 
C# Web Service (that calls task): this.Session.Timeout = 
C# Console Application (that calls web service): mySoapClient.InnerChannel.OperationTimeout = 
Powershell script (that calls console application): not required 
Смежные вопросы