领先技术: 子类化和重写ASP.NET页面 - 第I部分

2012-07-04
浏览
导读:某客户最近和找到我说我们需要对某些 ASP.NET 页面进行更改。您能帮忙吗?就像任何其他顾问一样,我马上答道当然,告诉我具体情况吧。但除了这些页面的 URL,该

某客户最近和找到我说“我们需要对某些 ASP.NET 页面进行更改。您能帮忙吗?”就像任何其他顾问一样,我马上答道“当然,告诉我具体情况吧。”但除了这些页面的 URL,该客户实际上几乎什么都没提供。不管怎样,该客户就是要修改一些 ASP.NET 页面,却没有源代码。一开始,我觉得这只是个问题而已,但随着与该客户交谈的深入,我愈发觉得这是一个有趣的挑战。

如果不给您按钮的源代码来创建派生类,也不给您 ASP.NET 页面的源代码来修改其行为,则在 Windows 编程中,通常要关联底层消息并子类化窗口。在 ASP.NET 中,则可以尝试关联页面事件以便重写页面行为并输出。

经过一番周密思考,我总结出了一些实际情形,在这些情形中,可能需要在不改动源代码的情况下修改 ASP.NET 页面的运行时行为。我还找到了许多可以完成这项任务的方法。在本文(共两部分)中,我将介绍这些方法以及如何仅通过只读访问甚至根本不访问源代码来更改 ASP.NET 页面的用户界面和行为。

可能的情形

假定某组用户在运行某 Web 应用程序的一个个性化版本,并且该应用程序需要一些远程调试或分析。您不能中断服务,但仍需要了解发生的情况。有了性能计数器和内置的跟踪功能可能还不够。所部署的 ASP.NET 页面有可能根本没有包含或启用跟踪指令。在这种情况下,您需要进行远程干预,注入跟踪代码,这是最基本的要求。

还有一种情形,就是需要临时更改多种页面。对于单个页面,您只需创建旧页面的一个副本并替换它即可。不过,更新多个页面可能就比较困难了,并且维护工作也可能及其复杂。

第三种情形,就是企业策略禁止对源代码进行写操作。在这种情况下,源代码可读,但不可修改。不过,您可以向站点添加扩展。

最后一种情形,也是最复杂并且我真的遇到过的一种情形,即公司运行的 Web 应用程序的源代码由于某种原因不再可用。

可以看出,需要在不访问源代码的情况下修改页面的运行时行为的情形非常多。那么接下来该怎么办呢?

可行的方法

有许多方法可以在不接触源代码的情况下修改正在运行的 ASP.NET 页面。图 1 列出了几种方法。不是所有的方法在任何情形下都有效,而且有些方法可以一起使用。有的方法可能需要编写新的 HTTP 模块或 HTTP 处理程序,有的方法则可能要求对 web.config 文件进行更改。大多数情况下都需要重新启动应用程序。实际上,如果更改 web.config 或 global.asax 文件,或添加到 Bin 文件夹或 App_Code 文件夹,就会自动重新启动应用程序。

Figure 1 在不访问源代码的情况下修改页面

方法 实现
访问控件树 HTTP 模块
修改页面基类 web.config
控件替换 web.config
构建提供程序 程序集
重定向页面 HTTP 处理程序
重写页面 HTTP 处理程序或 URL 重写

ASP.NET 2.0: 执行Web标准以便更加易于访问

ASP.NET 2.0在SQL Server 2005上自定义分页

ASP.NET 2.0(C#)(8) - DataSourceControl(

ASP.NET 2.0(C#)(7) - Profile(存储用户配

ASP.NET 2.0(C#)(6) - Membership&Role