导航

HttpContext 事件执行顺序!

Posted on 2010-10-03 17:52  fjcoder  阅读(711)  评论(0)    收藏  举报

代码
/// <summary>
///TestHttpModel 的摘要说明
/// </summary>
public class TestHttpModule : IHttpModule
{
int rsi = 0;
public TestHttpModule()
{
//
//TODO: 在此处添加构造函数逻辑
//
}

public void Dispose()
{

}

public void Init(HttpApplication context)
{
context.BeginRequest
+= new EventHandler(context_BeginRequest);//当请求发生时
context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);
context.AuthorizeRequest
+= new EventHandler(context_AuthorizeRequest);
context.PostAuthenticateRequest
+= new EventHandler(context_PostAuthenticateRequest);
context.PostAuthorizeRequest
+= new EventHandler(context_PostAuthorizeRequest);
context.ResolveRequestCache
+= new EventHandler(context_ResolveRequestCache);
context.PostResolveRequestCache
+= new EventHandler(context_PostResolveRequestCache);
context.PostMapRequestHandler
+= new EventHandler(context_PostMapRequestHandler);
context.AcquireRequestState
+= new EventHandler(context_AcquireRequestState);
context.PostAcquireRequestState
+= new EventHandler(context_PostAcquireRequestState);
context.PreRequestHandlerExecute
+= new EventHandler(context_PreRequestHandlerExecute);
context.PostRequestHandlerExecute
+= new EventHandler(context_PostRequestHandlerExecute);
context.ReleaseRequestState
+= new EventHandler(context_ReleaseRequestState);
context.PostReleaseRequestState
+= new EventHandler(context_PostReleaseRequestState);
context.UpdateRequestCache
+= new EventHandler(context_UpdateRequestCache);
context.PostUpdateRequestCache
+= new EventHandler(context_PostUpdateRequestCache);
//结束
context.EndRequest += new EventHandler(context_EndRequest);

context.Error
+= new EventHandler(context_Error);
context.PreSendRequestHeaders
+= new EventHandler(context_PreSendRequestHeaders);
context.PreSendRequestContent
+= new EventHandler(context_PreSendRequestContent);


//context.Disposed += new EventHandler(context_Disposed);

}
//001 在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生。此时:
//Context.User == null
//Context.Session == null
//(开始请求时)
void context_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(
"context_BeginRequest");
HttpContext.Current.Response.Write(
"<br />");
}
//002 配置的身份验证机制已对当前请求进行了身份验证,安全模块已建立用户标识。此时
// Context.Session == null
// Context.User <> null
//(身份验证完成时)
void context_AuthenticateRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(
"context_AuthenticateRequest");
HttpContext.Current.Response.Write(
"<br />");
}
//003 表示 ASP.NET 已对当前请求进行了授权
//预订 AuthorizeRequest 事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证和授权。
//此时:
//Context.Session == null
//(授权完成时)
void context_AuthorizeRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(
"context_AuthorizeRequest");
HttpContext.Current.Response.Write(
"<br />");
}
//004 在AuthenticateRequest事件发生之后引发本事件。事件
//预订 PostAuthenticateRequest 事件的功能可以访问由 PostAuthenticateRequest 处理的任何数据。
//例如:
// app.Context.User(实现IPrincipal, IIdentity)
// 只要我们自定义的MyUser类实现 IPrincipal, IIdentity 接口
// 我们就可以: MyUser myUser = GetMyUser(identityName)
// app.Context.User = myUser;
// 以后在 Page 页面就可以: var myuser = (MyUser)Page.User;此时的User不仅仅只有 Identity属性。
// 此时:Session == null
void context_PostAuthenticateRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(
"context_PostAuthenticateRequest");
HttpContext.Current.Response.Write(
"<br />");
}
//005 ASP.NET 已对当前请求进行了授权。
//订阅 PostAuthorizeRequest 事件可确保在处理附加的模块或处理程序之前对请求进行身份验证和授权。
//此时:
//Session=null
void context_PostAuthorizeRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(
"context_PostAuthorizeRequest");
HttpContext.Current.Response.Write(
"<br />");
}
//006 当 ASP.NET 完成授权事件(以使缓存模块从缓存中为请求提供服务)时发生
//此时 Session == null
void context_ResolveRequestCache(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(
"context_ResolveRequestCache");
HttpContext.Current.Response.Write(
"<br />");
}
// 007 在 ASP.NET 跳过当前事件处理程序的执行并允许缓存模块满足来自缓存的请求时发生
// 此时:HttpContext.Current.Handler == null
void context_PostResolveRequestCache(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(
"context_PostResolveRequestCache");
HttpContext.Current.Response.Write(
"<br />");
}
//008 在 ASP.NET 已将当前请求映射到相应的事件处理程序时发生。
// 在此之前:HttpContext.Current.Handler == null *************************************************************
void context_PostMapRequestHandler(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(
"context_PostMapRequestHandler");
HttpContext.Current.Response.Write(
"<br />");
}
//009 AcquireRequestState
//当 ASP.NET 获取与当前请求关联的当前状态(如会话状态)时发生。
void context_AcquireRequestState(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(
"context_AcquireRequestState");
HttpContext.Current.Response.Write(
"<br />");
}
// 010 在已获得与当前请求关联的请求状态(例如会话状态)时发生。
// 此时:
// Context.Session != null
void context_PostAcquireRequestState(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(
"context_PostAcquireRequestState");
HttpContext.Current.Response.Write(
"<br />");
}
// 011 准备开始执行事件处理程序(例如,某页index.aspx 或某个 XML Web services)前发生
// 到此为此: Session/User/Handler/身份验证/授权 都已完成
// 之后将执行 Page中的:OnInit,OnInitComplete,OnLoad,OnLoadComplete,OnPreRender
void context_PreRequestHandlerExecute(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(
"context_PreRequestHandlerExecute");
HttpContext.Current.Response.Write(
"<br />");
}
// 012 在 ASP.NET 事件处理程序(例如,某页index.aspx或某个 XML Web service)执行完毕时发生。
void context_PostRequestHandlerExecute(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(
"context_PostRequestHandlerExecute");
HttpContext.Current.Response.Write(
"<br />");
}
// 013 在 ASP.NET 执行完所有请求事件处理程序后发生。
//该事件将使状态模块保存当前状态数据。
//引发 ReleaseRequestState 事件以后,应用程序以该请求结束
void context_ReleaseRequestState(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(
"context_ReleaseRequestState");
HttpContext.Current.Response.Write(
"<br />");
}
// 014 状态数据已经存储完毕
// 在 ASP.NET 已完成所有请求事件处理程序的执行并且请求状态数据已存储时发生。
void context_PostReleaseRequestState(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(
"context_PostReleaseRequestState");
HttpContext.Current.Response.Write(
"<br />");
}
// 015 当 ASP.NET 执行完事件处理程序.UpdateRequestCache事件可被OutputCacheModule订阅。
// 并且输出内容已经准备好添加给输出缓冲的时候,引发这个事件
// 以使缓存模块存储将用于从缓存为后续请求提供服务的响应时发生
void context_UpdateRequestCache(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(
"context_UpdateRequestCache");
HttpContext.Current.Response.Write(
"<br />");
}
// 016 在 ASP.NET 完成了缓存模块的更新并存储了以下响应时发生,这些响应用于满足来自缓存的后续请求。
// PostUpdateRequestCache事件默认不被任何Module订阅。
void context_PostUpdateRequestCache(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(
"context_PostUpdateRequestCache");
HttpContext.Current.Response.Write(
"<br />");
}
// 017 结束请求,此后 HttpContext.Current == null
void context_EndRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(
"context_EndRequest");
HttpContext.Current.Response.Write(
"<br />");
}
// 018 捕获错误
void context_Error(object sender, EventArgs e)
{

HttpContext.Current.Response.Write(
"context_Error");
HttpContext.Current.Response.Write(
"<br />");

HttpContext context
= HttpContext.Current;
//错误处理程序
Exception exception = context.Server.GetLastError();

string sPath = "~/errorlog/" + DateTime.Today.ToString("yyyy-MM-dd") + ".txt";
if (!File.Exists(System.Web.HttpContext.Current.Server.MapPath(sPath)))
{
File.Create(System.Web.HttpContext.Current.Server.MapPath(sPath)).Close();
}

StreamWriter objStreamWriter
= File.AppendText(System.Web.HttpContext.Current.Server.MapPath(sPath));
{
objStreamWriter.WriteLine(
"错误发生在 : ");
objStreamWriter.WriteLine(
"{0}", DateTime.Now.ToString());
string sError = "错误发生在: " + System.Web.HttpContext.Current.Request.Url.ToString() +
". 错误内容:\n" + exception.Message;
objStreamWriter.WriteLine(sError);
objStreamWriter.WriteLine(
"__________________________");
objStreamWriter.Flush();
objStreamWriter.Close();
}
context.Server.ClearError();
//context.Response.Redirect("~/error.htm");

}
// 019 向客户端发送 HTTP 标头之前发生
// HttpContext.Current == null
void context_PreSendRequestHeaders(object sender, EventArgs e)
{
HttpApplication app
= (HttpApplication)sender;
var response
= app.Context.Response;
response.Write(
"context_PreSendRequestHeaders");
response.Write(
"<br />");
}
// 020 在ASP.NET把响应内容发送到客户端之前引发这个事件。
//这个事件允许我们在内容到达客户端之前改变响应内容。
//我们可以使用这个事件给页面输出添加用于所有页面的内容。例如通用菜单、头信息或脚信息。
void context_PreSendRequestContent(object sender, EventArgs e)
{
string path = "D:\\" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-fff") + ".txt";
System.IO.File.WriteAllText(path,
"context_PreSendRequestContent!" + DateTime.Now.ToString());
}

void context_Disposed(object sender, EventArgs e)
{

}
}