我的一个网站上有一个网络服务,它会重新启动网站应用程序池。
我遇到的问题是IIS7应用程序池一直停止并出现以下警告,然后出现错误:
警告: 在关闭期间,为应用程序池“appPoolNameHere”提供服务的进程超出了时间限制。
错误: 由于为该应用程序池提供服务的进程中出现一系列故障,应用程序池“appPoolNameHere”正在自动禁用。
我用来执行此操作的代码是:
try
{
var serverManager = new ServerManager();
var currentPoolName = SettingsManager.AppPoolName;
if (!string.IsNullOrEmpty(currentPoolName))
serverManager.ApplicationPools[currentPoolName].Recycle();
HttpRuntime.Close();
}
catch (Exception ex)
{
var exceptionManager = ExceptionManagerFactory.GetExceptionManager();
exceptionManager.LogException(ExceptionManager.Severities.Critical, ex,
"App Pool restart failed");
}
我没有得到任何异常被抛在这里,但是应用程序池正在停止,这不会一直发生并且很难复制,我已经尝试了几种不同的东西,甚至只是打破了该服务的地狱,有时候它很好,有时它会死。
我能做些什么来解决这个问题吗?
我必须重新启动它的原因是由于webconfig的外部配置文件处理了从管理系统更新的url重定向。
感谢您提供任何帮助。
答案 0 :(得分:1)
好吧,我似乎已经对这个问题进行了分类(没有修复),还有一些胶带和粘背塑料。
解决方案
更改了应用程序池设置:快速失败保护为false
这会阻止IIS在几次失败请求后终止应用程序池。
我还在重试系统中添加了,所以如果循环请求失败,它会等待10秒并再次尝试,它会在放弃并发出异常通知之前执行5次。
这已经解决了这个问题,而且一切似乎再次运转良好,虽然有些关于此事的尖叫声这是错误的!!在我身边。
仅当IIS监视网站中的其他文件并在看到更改时重新启动应用程序池时才会这样做。
答案 1 :(得分:0)
我没有使用Microsoft.Web.Administration
命名空间,但是如何卸载应用程序域并向您的网站发送请求以便再次启动应用程序呢?
Peter Bromberg的好example(第二点)如何做到这一点。
<强>更新强>
读取错误堆栈
System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
at Microsoft.Web.Administration.Interop.IAppHostMethodInstance.Execute()
我想到了最常见的原因:权利不足。所有管理操作都需要管理权限。当执行上面的代码时,模拟了哪个用户帐户? IUSR?切换到该块的任何管理员,它应该毫无例外地工作。