我有一个运行控制台.exe应用程序的powershell脚本。控制台应用程序运行Web服务。网络服务大约需要10分钟来完成任务。
在生产环境中,powershell脚本在大约130秒后完成,Web服务任务终止。这是核心问题!一切都在当地环境中运作良好。
Powershell版本2在本地和生产中都在运行。
从控制台运行powershell脚本时。在本地,powershell脚本打印控制台应用程序的返回值。在制作中,屏幕上没有任何内容。它只显示一个新的命令提示符。
任务可以从生产环境中的网页上异步运行。
本地/生产环境中的所有应用程序代码/配置文件都是相同的。
唯一有意义的是powershell脚本超时并终止控制台应用程序,从而终止Web服务。
已经研究过PowerShell超时,并使用过不同的脚本。但它在本地工作的事实似乎表明了PowerShell的默认设置问题。
此页面介绍了超时设置: http://www.ehow.com/how_12026004_set-timeout-powershell.html
但运行:Dir WSMan:\ localhost \ shell在生产中运行时导致找不到路径错误。
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)
答案 0 :(得分:0)
我在这里做了一个不正确的假设。 powershell脚本没有返回控制台应用程序的结果。控制台应用程序失败了。但是因为脚本输出“0”我认为它是成功的(由控制台应用程序返回)。将以下行添加到powershell脚本返回实际返回值:
Write-Host "CONSOLEEXITCODE : $LASTEXITCODE"
现在很明显控制台应用程序失败而不是powershell脚本(正如聪明的ping测试所证明的那样)我添加了一个Console.WriteLine来写错误(到powershell命令窗口):
内容类型text / html;响应消息的charset = utf-8与th不匹配 绑定的内容类型(text / xml; charset = utf-8)。如果使用自定义编码器,请确保IsContentTypeSuppor ted方法正确实施。
这让我陷入了疯狂的追逐。直到我陷入并记录了所有Web服务和任务错误,我在任务中发现了以下错误:
线程正在中止。
修复就像增加“线程”超时一样简单:
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