65.9K
CodeProject 正在变化。 阅读更多。
Home

应用程序块 - ASP.NET 网站维护

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.86/5 (3投票s)

2007年8月13日

CPOL

3分钟阅读

viewsIcon

42490

downloadIcon

637

ASP.NET 网站最终会部署到生产服务器。随着应用程序的增长,网页数量也会随之增加。不可避免地会出现 bug 或崩溃。部署后,应该有方法来优雅地维护网站。

Comat WebSite Watcher

引言

ASP.NET 网站最终会部署到生产服务器。部署已经进行了精细调整,可以部署一个包含已自 VS2005 集成的单个页面程序集的单页面。随着应用程序的增长,网页数量也会随之增加。不可避免地会出现 bug 或崩溃。部署后,应该有方法来优雅地维护此网站。

背景

虽然有其他粗糙的 ASP.NET 网站维护方法,但我认为需要更结构化。考虑到 ASP.NET 网站可以跨越多个模块,包含数百个页面,因此维护的控制级别应该是可配置的。如果我们能够控制到页面级别,岂不是更好?

本文解决了这个问题,主要面向关心 Web 应用程序优雅维护的架构师、技术主管和配置管理员。

本文使用 HttpModule 来执行此任务,并结合自定义的 web.config 配置设置。

Using the Code

此功能只能在生产环境 (Live) 或质量保证环境 (Testing) 中使用,切勿在开发环境 (Development) 中使用。可以通过将附件二进制文件中提供的程序集 Comat.WebSiteWatcher.Business.dllComat.WebSiteWatcher.Config.dll 复制到 Web 应用程序的 bin 文件夹,并对 web.config 文件进行可配置的更改,轻松地将其集成到现有应用程序中。

网站监视器模块

这是一个 HttpModule,它被加载到 HttpApplicationHttpModule 集合中,如上图所示。它需要在重定向模块(如 FormsAuthentication 等)之前加载。我们使用 HttpModule 来防止不必要的页面请求处理。

如果不存在重定向模块,则按如下方式添加模块:

<httpModules>
    <add type="Comat.WebSiteWatcher.Business.WebSiteWatcherModule, 
              Comat.WebSiteWatcher.Business" name="WebsiteWatcher" />
</httpModules>

如果使用了 FormsAuthentication 等重定向模块,则需要进行变通。我希望 ASP.NET 团队能够提供一个在特定位置而不是最后添加模块的功能。

<httpModules>

    <remove name="FormsAuthentication" />
    <remove name="UrlAuthorization" />

    <add type="Comat.WebSiteWatcher.Business.WebSiteWatcherModule, 
              Comat.WebSiteWatcher.Business" name="WebsiteWatcher" />

    <add name="FormsAuthentication" 
      type="System.Web.Security.FormsAuthenticationModule" />
    <add name="UrlAuthorization" 
      type="System.Web.Security.UrlAuthorizationModule" />

</httpModules>

配置设置

模块加载后,我们需要在 web.config 文件中为其提供配置设置。

<comat.webSiteWatcher isUsed="true">
    <webSite isBlocked="false" redirectUrl="~/Maintenance/WebsiteDown.aspx">
        <blockFolders redirectUrl="~/Maintenance/ModuleDown.aspx">
            <!-- block all folders which have this folder combination -->
            <blockFolder>/BlockedFolder/SubFolder/</blockFolder>
            <!-- block only this particular folder -->
            <blockFolder>https:///Security2005/BillManager/</blockFolder>
        </blockFolders>
        <blockPages redirectUrl="~/Maintenance/PageDown.aspx">
            <!-- block all pages in any folder with name Customer.aspx -->
            <blockPage>Customer.aspx</blockPage>
            <!-- block only this particular page -->
            <blockPage>https:///Security2005/Default.aspx</blockPage>
        </blockPages>
    </webSite>
</comat.webSiteWatcher>

这些设置不言自明。我们可以控制是否:

  1. 使用此 HttpModule
  2. 关闭整个网站
  3. 关闭模块或文件夹
  4. 关闭网页

根据您的需要,值可以是相对的或绝对的。指定 Customer.aspx 的示例将阻止所有文件夹中名称为 Customer.aspx 的页面。不支持波浪号 (~) 路径。如果您想要绝对路径,请指定完整路径,如 https:///Security2005/Default.aspx。文件夹也是如此。为网站提供了高级开关,以便在发生重大崩溃时可以快速启用它,或者在不处于维护模式时选择不使用 HttpMododule

现在我们已经指定了这些设置,我们需要能够读取它们。为此,我们创建自己的自定义 <configSections> 节点。我们需要将其添加到 web.config 文件中 <configuration> 设置的顶部。

<configSections>
    <section name="comat.webSiteWatcher"
      type="Comat.WebSiteWatcher.Config.ModuleConfig,Comat.WebSiteWatcher.Config" />
</configSections>

维护页面

redirectUrl 属性指向显示自定义维护消息的页面,例如网站、模块或页面因维护而关闭。这需要放在一个单独的文件夹中,并删除安全限制,以便请求可以重定向到这些页面。在此示例中,我们使用表单身份验证,并通过在该文件夹中拥有一个具有以下设置的 web.config 来覆盖这些设置:

<system.web>
    <authorization>
        <!-- Allow all users -->
        <allow users="*"/>
    </authorization>
</system.web>

注意事项

  • 如果性能是一个主要关注点,请在不处于维护模式时注释掉 Web.Config 中的这三项设置。
  • App_Offline.htm 是一个用于关闭网站的文件。这非常基本,不提供任何配置。
  • web.config 中的 <location> 节点可以阻止对文件夹的访问,而无需为用户特定消息进行任何配置设置。
  • 这也可以扩展到阻止敏感文件夹,就像 ASP.NET ISAPI 过滤器对 App_CodeApp_Data 等文件夹所做的那样。在这里,我们可以自定义哪些文件夹是敏感的,并提供自定义消息,而不是默认的 页面未找到 消息。

历史

  • 2007 年 8 月 13 日:初始版本。
© . All rights reserved.