asp.net中httpModule计算页面的执行时间

作者:袖梨 2022-06-25

ASP.NET系统中默认的HttpModule:

DefaultAuthenticationModule 确保上下文中存在 Authentication 对象。无法继承此类。
FileAuthorizationModule 验证远程用户是否具有访问所请求文件的 NT 权限。无法继承此类。
FormsAuthenticationModule 启用 ASP.NET 应用程序以使用 Forms 身份验证。无法继承此类。
PassportAuthenticationModule 提供环绕 PassportAuthentication 服务的包装。无法继承此类。
SessionStateModule   为应用程序提供会话状态服务。
UrlAuthorizationModule   提供基于 URL 的授权服务以允许或拒绝对指定资源的访问。无法继承此类。
WindowsAuthenticationModule 启用 ASP.NET 应用程序以使用 Windows/IIS 身份验证。无法继承此类


创建一个类库,建立如下类:

 代码如下 复制代码

using System;  
using System.Collections.Generic;  
using System.Web;//引用web命名空间   
using System.Text;  
namespace TimerHttpModule  
{  
    public class Class1:IHttpModule//继承IHttpModules   
    {  
          
        public void Init(HttpApplication application)//实现IHttpModules中的Init事件   
        {  
            //订阅两个事件   
            application.BeginRequest +=new EventHandler(application_BeginRequest);  
            application.EndRequest+=new EventHandler(application_EndRequest);  
        }  
        private DateTime starttime;  
        private void application_BeginRequest(object sender, EventArgs e)  
        {  
            //object sender是BeginRequest传递过来的对象   
            //里面存储的就是HttpApplication实例   
            //HttpApplication实例里包含HttpContext属性   
            starttime = DateTime.Now;  
        }  
        private void application_EndRequest(object sender, EventArgs e)  
        {  
            DateTime endtime = DateTime.Now;  
            HttpApplication application = (HttpApplication)sender;  
            HttpContext context = application.Context;  
            context.Response.Write("

页面执行时间:" + (endtime - starttime).ToString() + "

");  
        }  
        //必须实现dispose接口   
        public void Dispose() { }  
    }  
}

生成后将dll文件copy到bin目录,接着在web.config中注册这个HttpModule:

 代码如下 复制代码

   
            
           
               
       
   
   
   

这样网站的每一个.net页面底部都会显示页面的执行时间了。

不过这样做要小心,因为每个.net页面末尾都会被加上执行时间,包括webservices和ashx页面,以及你可能不是用来直接做页面的.aspx页面(例如你用来输入json数据或者xml数据)。所以,为了保证安全,还必须采取有针对性的方法来避免这种情况的发生。

方法一:

在Response.Write方法之前做判断,排除一些不想添加执行时间的页面,可以通过Request.URL来判断;

方法二:

不要把执行时间直接添加到页面输出的尾端,而是作为一个http header输出。使用Response.AddHeader(key,value)可以实现这个愿望。

总结:一个Http请求在被ASP.NET Framework捕获之后会依次交给HttpModule以及HttpHandler来处理。hm与hh之间不是完全独立的,实际上,http请求在hm传递的过程中会在某个事件内将控制权转交给hh的,而真正的处理在HttpHandler中执行完成后,HttpHandler会再次将控制权交还给HttpModule
上面的代码中的HttpModule的Init()中的参数是HttpApplication类型,它具有许多事件,包括BeginRequest,EndRequest,AuthentiacteRequest 等等

相关文章

精彩推荐