app_offline.htm在生产框上抛出HTTP 500错误

时间:2011-02-08 00:49:57

标签: asp.net asp.net-mvc app-offline.htm

我为64位IIS7 / Win2008上运行的ASP.NET MVC2应用程序创建了一个 app_offline.htm 文件,并确保它超过512字节(现在是2KB)。在我运行Visual Studio 2010的开发盒上,它就像一个魅力,但当我把它放在生产盒上时,我得到的只是通用的HTTP 500错误,说“由于发生内部服务器错误,页面无法显示”。

特别奇怪的是,我没有在应用程序事件日志中记录任何内容,ELMAH也没有选择任何内容。我已经禁用了自定义错误,为文件放置了FormsAuthentication位置异常,确保我没有引用任何其他文件(图像等),但没有任何修复它。

我已经阅读了关于SO和谷歌搜索的每个帖子几个小时,无法解决这个问题。什么想法可能是错的?我把头发拉到这里......

2 个答案:

答案 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,但在你之前   开始部署应用程序文件。   整个过程如下:

     
      
  1. 添加app_offline.htm
  2.   
  3. 将应用程序的web.config替换为临时web.config(如上所述)
  4.   
  5. 请求站点上的任何ASP.NET资源,以便新的   waitChangeNotification获取“applied”*
  6.   
  7. 进行必要的文件系统更改(部署bin dlls,其他站点   文件)
  8.   
  9. 将临时web.config替换为原始应用程序   的web.config
  10.   
  11. 删除app_offline.htm
  12.         

    *您可能会质疑步骤2-3中发生的情况,因为ASP.NET关闭了   在第1步之后申请。确实如此   我的事件查看器中没有显示   web.config更改是   由于注册或“申请”   无论是第2步还是第3步,但仍然如此   更新的waitChangeNotification   设置确实在步骤3之后应用。

More app_offline.htm woes

App_offline.htm gotchas with ASP.NET MVC

答案 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>