向 ASP.NET 页面添加构建横幅






4.74/5 (20投票s)
本文介绍了一种可插拔的方法,用于在调试模式下构建的页面上放置横幅,而无需进行任何代码更改。

引言
开发 Web 应用程序通常是一个非常动态的过程,该技术的“即时可用”性质使其适合迭代开发过程和频繁发布。
在为 UAT(用户验收测试)部署构建时,向客户显示一些东西来提醒他们当前的构建是调试构建是很有帮助的,原因如下
- 如果在此横幅中显示版本号,则可以在提交反馈时轻松引用它。
- 与同一程序集的发布版本相比,构建版本通常性能较差,该横幅可以解释这一点。
- 用户可能会错误地将测试站点用作实时站点,反之亦然(这种情况经常发生!),该横幅使这一点显而易见。
本文档介绍并提供了功能齐全的代码,用于 HTTP 管道的插件,该插件会将这样的“开发横幅”呈现到相关网站中的任何 ASPX 页面。
唯一的要求是将适当的配置添加到 *Web.config* 文件中,并确保横幅程序集位于站点的 *bin* 目录中。
示例横幅作为浮动角图像添加到页面中,以免中断页面的布局。 图像、ALT 文本和 JavaScript 都存储为最终程序集中的嵌入式资源,从而使其成为一个完全独立且模块化的工具。
背景和先决条件
需要 ASP.NET 的基本知识,对 HTTP 管道的基本了解会有所帮助,但不是强制性的。 事实上,如果您只想开始使用该示例,您可以下载已完成的程序集并直接跳到下面的“配置”部分!
浮动图像
要放置在网页上的横幅图像只是一个部分透明的 PNG,周围环绕着一个绝对定位的 DIV
,该 DIV
与页面的右上角对齐。 JavaScript 用于将所需的 HTML 放置在页面上,而不是将 HTML 直接插入到超文本流中。
<div style="Position: absolute;Top: 0;Right: 0;
Background: transparent;Filter: Alpha(Opacity=60);-moz-opacity:.60;opacity:.60;">
<img src="{0}" alt=\"development build: version {1}\" />
</div>
字符串格式用于将横幅图像的 URL 和替代文本插入到 HTML 字符串中。
// obtain the version number of the executing assembly,
// so that it may be used in the banners alternate text
Version version = page.GetType().BaseType.Assembly.GetName().Version;
// retrieve the banner HTML from the localized resources,
// inserting a dynamic URL for the image, and the alternate text
string szHtml = string.Format(BuildConfigurationBannerResources.BannerHtml,
page.ClientScript.GetWebResourceUrl(GetType(),
"Common.Web.Resources.BannerImage.png"), version);
// register a JavaScript that will insert the HTML into the DOM
// after the page has loaded.
page.ClientScript.RegisterStartupScript(GetType(), "DevelopmentBanner",
string.Format("Event.observe(window, 'load', function()
{{new Insertion.Bottom($(document.body), '{0}');}});", szHtml), true);
HTTP 管道:动态操纵 ASP
HTTP 管道是 ASP.NET 中的执行序列,它对服务 HTTP 请求时的执行序列进行排序。
基本上,HTTP 模块是 IHttpModule
接口的实现,配置为通过 *Web.config* 合并到此执行序列中,从而使开发人员可以轻松地将功能添加到此管道中。
我们将使用 HTTP 模块在运行时服务的所有 ASP.NET 页面上注册我们的自定义 JavaScript。
我们感兴趣的管道事件是 PreRequestHandlerExecute
,我们将在其中附加我们的自定义 JavaScript。 我们可以直接操作 HTML 内容,但是没有必要产生解析 HTML 的复杂性,因为我们可以简单地使用 C# Page
对象模型 - 这反过来会处理 HTML 输出。
我们可以通过应用程序的 Context Handler
访问 Page
对象,如果是针对 ASPX 页面的请求,这将是一个 Page
实例(而不是 AXD 或其他一些运行时映射的 URL 类型)。
IHttpHandler handler = application.Context.Handler;
if (handler is Page)
{
Page page = handler as Page;
if (IsAssemblyDebugBuild(page))
{
...
}
}
决定是否显示或隐藏横幅
为了确定 Web 应用程序程序集是否是调试版本,以下代码在程序集上查找 DebuggableAttribute
- 这是 .NET 编译器在调试构建期间插入的。
private bool IsAssemblyDebugBuild(Page page)
{
foreach (Attribute att in
page.GetType().BaseType.Assembly.GetCustomAttributes(false))
if (att is System.Diagnostics.DebuggableAttribute)
return (att as System.Diagnostics.DebuggableAttribute).IsJITTrackingEnabled;
return false;
}
配置
要将 Web 应用程序配置为使用横幅,请确保横幅程序集位于 Web 应用程序的 *bin* 目录中,并将以下 XML 放置在 *Web.config* 文件中。
<httpModules>
<add name="Banner" type="Common.Web.Modules.BuildConfigurationBannerModule,
Common.Web"/>
</httpModules>
这就是所需要的全部,并且在构建为调试程序集时,应用程序中的所有网页都将应用该横幅。
历史
- 2007.01.30:首次发布