HttpContext.Current.Session在Global.asax中为空

时间:2015-03-12 15:42:15

标签: asp.net session-variables global-asax

我使用了表单身份验证。 在LdapAuthentication.cs中我有属性

public static string ReturnProject
    {
        get
        {
            return HttpContext.Current.Session["Project"].ToString();
        }
    }

在global.asax.cs中,我尝试从LdapAuthentication.cs获取Session [“Project”]以进行检查,并根据Session [“Project”]中的rusult转发到其他页面,但我有System.NullReferenceException。我在LdapAuthentication.cs中讨论了Session [“Project”] - 没问题

protected void Application_AcquireRequestState(object sender, EventArgs e)
    {
        if (Request.AppRelativeCurrentExecutionFilePath == "~/")
        {
            if (LdapAuthentication.ReturnProject == "Team Leader")
                HttpContext.Current.RewritePath("~/TLPage.aspx");
            else
                if (LdapAuthentication.ReturnName == "ccobserver")
                    HttpContext.Current.RewritePath("~/ScheduleReport.aspx");
                else
                    HttpContext.Current.RewritePath("~/PersonPage.aspx");
        }
    }

哪个处理程序使用Application_AcquireRequestState或Application_AuthenticateRequest无关紧要。

谢谢!

1 个答案:

答案 0 :(得分:0)

您声明了ReturnProject 静态属性,而HttpContextHttpApplication class实例属性,在Global.asax中实现}。

静态属性无法访问实例属性,因此从static删除ReturnProject修饰符可以解决问题。

修改

现在我得到它,ReturnProject属性在LdapAuthentication.cs中声明,而不是在Global.asax中声明。

让我解释一下。每次请求命中服务器时,都会创建HttpApplication的新实例(因此,HttpContext实例属性)。通过这种方式,您可以访问RequestSession - 它们与具体用户相关的具体请求绑定。相关回答:“HttpContext.Current.Session” vs Global.asax “this.Session”

您似乎想要实现的是以一种很好的方式将一些会话变量(Project)传递给LdapAuthentication类。有多种方法可以做到这一点,但是没有查看LdapAuthentication类的源的明显方法是将LdapAuthentication实例字段添加到Global.asax,通过构造函数或属性传递会话变量初始化。像这样:

<强> LdapAuthentication.cs

/// <summary>
/// Creates instance of LdapAuthentication with Project value initialized
/// </summary>
public LdapAuthentication(string project) {
    this.ReturnProject = project;
}

<强> Global.asax中

private LdapAuthentication auth = new LdapAuthentication(
       HttpContext.Current.Session["Project"].ToString()
);
...
protected void Application_AcquireRequestState(object sender, EventArgs e)
    {
        if (Request.AppRelativeCurrentExecutionFilePath == "~/")
        {
            if (auth.ReturnProject == "Team Leader")
                HttpContext.Current.RewritePath("~/TLPage.aspx");
            else
                if (auth.ReturnName == "ccobserver")
                    HttpContext.Current.RewritePath("~/ScheduleReport.aspx");
                else
                    HttpContext.Current.RewritePath("~/PersonPage.aspx");
        }
    }