asp.net:在没有会话的情况下将代码重定向到主页的位置?

kac*_*apy 6 c# asp.net session

我有一个带有大量页面的Web应用程序,其中大多数需要一些会话变量才能运行.

我想在我的应用程序中添加一些防御性代码.在哪里是最好的地方,如:

if (Session.Count == 0){
                Response.Redirect("~/default.aspx");
}
Run Code Online (Sandbox Code Playgroud)

编辑:我如何检查当前页面是否defult.aspx?

Waq*_*aja 16

很难,是的,幸运的是它已经解决了.

您需要在Global.asax中实现Application_PreRequestHandlerExecute

这是代码

    /// <summary>
    /// The event occurs just after Initialization of Session, and before Page_Init event
    /// </summary>
    protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
    {
        // here it checks if session is reuired, as
        // .aspx requires session, and session should be available there
        // .jpg, or .css doesn't require session so session will be null
        // as .jpg, or .css are also http request in any case
        // even if you implemented URL Rewritter, or custom IHttp Module
        if (Context.Handler is IRequiresSessionState
               || Context.Handler is IReadOnlySessionState)
        {
            // here is your actual code
            // check if session is new one
            // or any of your logic
            if (Session.IsNewSession
                || Session.Count < 1)
            {
                // for instance your login page is default.aspx
                // it should not be redirected if,
                // if the request is for login page (i.e. default.aspx)
                if (!Context.Request.Url.AbsoluteUri.ToLower().Contains("/default.aspx"))
                {
                    // redirect to your login page
                    Context.Response.Redirect("~/default.aspx");
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

编辑1:解释和结论

正如其中一个人讲述了ASP.NET应用程序生命周期.

发生了很多事件.

实际上,Global.asax中的事件按以下顺序提升

  1. 验证请求//看起来只是内部机制
  2. 执行URL映射//看起来只是内部机制

  3. 提升BeginRequest事件.

  4. 提升AuthenticateRequest事件.
  5. 提升PostAuthenticateRequest事件.
  6. 提升AuthorizeRequest事件.
  7. 提升PostAuthorizeRequest事件.
  8. 提升ResolveRequestCache事件.
  9. 提升PostResolveRequestCache事件.
  10. 只需选择一个为应用程序实现IHttpHandler的类//看起来只是内部机制
  11. 提升PostMapRequestHandler事件.
  12. 提升AcquireRequestState事件. 在提出此事件之前,asp.net会像Session一样加载状态
  13. 提升PostAcquireRequestState事件.
  14. 提升PreRequestHandlerExecute事件.
  15. 调用ProcessRequest方法

结论:AcquireRequestState事件之前的所有事件都没有Session对象,因为Session没有被ASP.Net加载,所以来自*"AcquireRequestState**事件的任何事件都给出了Session对象因此解决了这个问题.但是我需要进行一些检查在上面的代码中提到