在软件开发过程中,迭代开发和频繁发布是一种非常动态的过程。技术的特性使得可以即时获取反馈,这对于改进产品至关重要。在进行用户接受测试(UAT)时,向用户展示当前构建是调试版本是非常有帮助的,原因有很多:
如果在这个横幅中显示版本号,用户在提交反馈时可以轻松引用。
调试版本的性能通常比发布版本的性能差,横幅可以解释这一点。
用户可能会不小心将测试站点误认为是实时站点,或者反之(这种情况经常发生!),横幅可以使这一点变得明显。
本文将解释并提供完整的代码,用于实现一个插件,该插件将向任何ASPX页面渲染这样一个“开发横幅”。
唯一要求是在Web.config文件中添加适当的配置,并确保横幅程序集在网站的bin目录中。
示例横幅作为页面角落的浮动图像添加,以免干扰页面布局。图像、ALT文本和JavaScript都存储在最终程序集中的嵌入式资源中,使这成为一个完全独立且模块化的工具。
需要基本的ASP.NET知识,对HTTP管道有一个基本的理解会很有帮助,但不是必需的。实际上,如果想直接使用示例,可以下载完成的程序集,并跳转到下面的“配置”部分!
要放置在Web页面上的横幅图像是一个部分透明的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字符串中。
获取执行程序集的版本号,以便在横幅的备用文本中使用。
var version = page.GetType().BaseType.Assembly.GetName().Version;
var szHtml = string.Format(BuildConfigurationBannerResources.BannerHtml,
page.ClientScript.GetWebResourceUrl(GetType(),
"Common.Web.Resources.BannerImage.png"), version);
page.ClientScript.RegisterStartupScript(GetType(),
"DevelopmentBanner",
string.Format("Event.observe(window, 'load', function() {{new Insertion.Bottom($(document.body), '{0}');}});", szHtml), true);
注册一个JavaScript,该JavaScript将在页面加载后将HTML插入到DOM中。
ASP.NET中的HTTP管道是一个执行序列,用于在处理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目录中,并在Web.config文件中放置以下XML。
<httpModules>
<add name="Banner" type="Common.Web.Modules.BuildConfigurationBannerModule, Common.Web" />
</httpModules>