我为64位IIS7 / Win2008上运行的ASP.NET MVC2应用程序创建了一个 app_offline.htm 文件,并确保它超过512字节(现在是2KB)。在我运行Visual Studio 2010的开发盒上,它就像一个魅力,但当我把它放在生产盒上时,我得到的只是通用的HTTP 500错误,说“由于发生内部服务器错误,页面无法显示”。
特别奇怪的是,我没有在应用程序事件日志中记录任何内容,ELMAH也没有选择任何内容。我已经禁用了自定义错误,为文件放置了FormsAuthentication位置异常,确保我没有引用任何其他文件(图像等),但没有任何修复它。
我已经阅读了关于SO和谷歌搜索的每个帖子几个小时,无法解决这个问题。什么想法可能是错的?我把头发拉到这里......
答案 0 :(得分:12)
<强>更新:
强>
你在web.config中有这个吗?
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<httpRuntime waitChangeNotification="300" maxWaitChangeNotification="300"/>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
</configuration>
但还有一个问题。
ASP.NET将卸载应用程序 一旦web.config被更改,但是 它实际上不会重新加载并应用 “waitChange ...”设置直到a 提出要求。所以你还可以 删除app_offline.htm和 web.config中,如果第一次请求 当dll只有一半时发生 复制后,将发生异常。至 侮辱伤害,例外 将一直持续到你更换 临时web.config或总计 你的“waitChange ......”时间的持续时间 到期!
要绕过这个最后的障碍,你会 需要向...提出请求 上传后的应用程序 临时web.config,但在你之前 开始部署应用程序文件。 整个过程如下:
- 添加app_offline.htm
- 将应用程序的web.config替换为临时web.config(如上所述)
- 请求站点上的任何ASP.NET资源,以便新的 waitChangeNotification获取“applied”*
- 进行必要的文件系统更改(部署bin dlls,其他站点 文件)
- 将临时web.config替换为原始应用程序 的web.config
- 删除app_offline.htm
醇>*您可能会质疑步骤2-3中发生的情况,因为ASP.NET关闭了 在第1步之后申请。确实如此 我的事件查看器中没有显示 web.config更改是 由于注册或“申请” 无论是第2步还是第3步,但仍然如此 更新的waitChangeNotification 设置确实在步骤3之后应用。
答案 1 :(得分:3)
我想出了一个100%用于我们部署的解决方案,所以我想我会分享它。
此解决方案将 customErrors 部分添加到 web.config 。这将捕获任何未处理的异常。它会重定向到 App_Offline.htm ,该应用会刷新,直到应用程序重新联机。因此,当应用程序可用时,用户会得到一个很好的加载器。
我希望这有用:)
批处理文件
copy "C:\www\_App_Offline.htm" "C:\www\App_Offline.htm"
copy /y "C:\www\App_Offline.config" "C:\www\Web.config"
Rem do deploy/publish actions
Rem Note: Our publish replaces/restores the Web.config. You should do that here.
del "C:\www\App_Offline.htm"
<强> App_Offline.config 强>
<?xml version="1.0"?>
<configuration>
<system.web>
<httpRuntime waitChangeNotification="100" maxWaitChangeNotification="100"/>
<customErrors defaultRedirect="App_Offline.htm" mode="On">
</customErrors>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
</configuration>
<强> _App_Offline.htm 强>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Application Offline</title>
<meta charset="UTF-8">
<style>
.facebook_blockG { background-color: none; border: 3px solid #D6D6D6; float: left; height: 40px; margin-left: 7px; width: 24px; opacity: 0; -moz-animation-name: bounceG; -moz-animation-duration: 1.3s; -moz-animation-iteration-count: infinite; -moz-animation-direction: linear; -moz-transform: scale(0.7); -webkit-animation-name: bounceG; -webkit-animation-duration: 1.3s; -webkit-animation-iteration-count: infinite; -webkit-animation-direction: linear; -webkit-transform: scale(0.7); -ms-animation-name: bounceG; -ms-animation-duration: 1.3s; -ms-animation-iteration-count: infinite; -ms-animation-direction: linear; -ms-transform: scale(0.7); -o-animation-name: bounceG; -o-animation-duration: 1.3s; -o-animation-iteration-count: infinite; -o-animation-direction: linear; -o-transform: scale(0.7); animation-name: bounceG; animation-duration: 1.3s; animation-iteration-count: infinite; animation-direction: linear; transform: scale(0.7); }
#blockG_1 { -moz-animation-delay: 0.39s; -webkit-animation-delay: 0.39s; -ms-animation-delay: 0.39s; -o-animation-delay: 0.39s; animation-delay: 0.39s; }
#blockG_2 { -moz-animation-delay: 0.52s; -webkit-animation-delay: 0.52s; -ms-animation-delay: 0.52s; -o-animation-delay: 0.52s; animation-delay: 0.52s; }
#blockG_3 { -moz-animation-delay: 0.65s; -webkit-animation-delay: 0.65s; -ms-animation-delay: 0.65s; -o-animation-delay: 0.65s; animation-delay: 0.65s; }
@-moz-keyframes bounceG {
0% { -moz-transform: scale(1.2); opacity: 0.6; }
100% { -moz-transform: scale(0.7); opacity: 0; }
}
@-webkit-keyframes bounceG {
0% { -webkit-transform: scale(1.2); opacity: 0.6; }
100% { -webkit-transform: scale(0.7); opacity: 0; }
}
@-ms-keyframes bounceG {
0% { -ms-transform: scale(1.2); opacity: 0.6; }
100% { -ms-transform: scale(0.7); opacity: 0; }
}
@-o-keyframes bounceG {
0% { -o-transform: scale(1.2); opacity: 0.6; }
100% { -o-transform: scale(0.7); opacity: 0; }
}
@keyframes bounceG {
0% { transform: scale(1.2); opacity: 0.6; }
100% { transform: scale(0.7); opacity: 0; }
}
</style>
</head>
<body>
<div id="overlay" class="trans">
<div id="overlay-inner" class="trans login">
<h1 style="line-height:1em; font-size:30pt">Application Offline</h1>
<h2 style="line-height:1em; width:70%; margin:auto">application is offline for maintenance</h2>
<div style="width: 128px; margin:40px auto">
<div id="blockG_1" class="facebook_blockG">
</div>
<div id="blockG_2" class="facebook_blockG">
</div>
<div id="blockG_3" class="facebook_blockG">
</div>
</div>
</div>
</div>
<script type="text/javascript">
function getParameterByName(name) {
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
results = regex.exec(location.search);
return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}
setTimeout(function () {
var loc = getParameterByName('aspxerrorpath');
loc = (loc) ? window.location.protocol + '//' + window.location.host + loc : window.location.href;
window.location.assign(loc);
}, 1500);
</script>
</body>
</html>