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






3.86/5 (3投票s)
ASP.NET 网站最终会部署到生产服务器。随着应用程序的增长,网页数量也会随之增加。不可避免地会出现 bug 或崩溃。部署后,应该有方法来优雅地维护网站。
引言
ASP.NET 网站最终会部署到生产服务器。部署已经进行了精细调整,可以部署一个包含已自 VS2005 集成的单个页面程序集的单页面。随着应用程序的增长,网页数量也会随之增加。不可避免地会出现 bug 或崩溃。部署后,应该有方法来优雅地维护此网站。
背景
虽然有其他粗糙的 ASP.NET 网站维护方法,但我认为需要更结构化。考虑到 ASP.NET 网站可以跨越多个模块,包含数百个页面,因此维护的控制级别应该是可配置的。如果我们能够控制到页面级别,岂不是更好?
本文解决了这个问题,主要面向关心 Web 应用程序优雅维护的架构师、技术主管和配置管理员。
本文使用 HttpModule
来执行此任务,并结合自定义的 web.config 配置设置。
Using the Code
此功能只能在生产环境 (Live) 或质量保证环境 (Testing) 中使用,切勿在开发环境 (Development) 中使用。可以通过将附件二进制文件中提供的程序集 Comat.WebSiteWatcher.Business.dll 和 Comat.WebSiteWatcher.Config.dll 复制到 Web 应用程序的 bin 文件夹,并对 web.config 文件进行可配置的更改,轻松地将其集成到现有应用程序中。
网站监视器模块
这是一个 HttpModule
,它被加载到 HttpApplication
的 HttpModule
集合中,如上图所示。它需要在重定向模块(如 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>
这些设置不言自明。我们可以控制是否:
- 使用此
HttpModule
- 关闭整个网站
- 关闭模块或文件夹
- 关闭网页
根据您的需要,值可以是相对的或绝对的。指定 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_Code、App_Data 等文件夹所做的那样。在这里,我们可以自定义哪些文件夹是敏感的,并提供自定义消息,而不是默认的 页面未找到 消息。
历史
- 2007 年 8 月 13 日:初始版本。