我使用了表单身份验证。 在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无关紧要。
谢谢!
答案 0 :(得分:0)
您声明了ReturnProject
静态属性,而HttpContext
是HttpApplication
class的实例属性,在Global.asax
中实现}。
静态属性无法访问实例属性,因此从static
删除ReturnProject
修饰符可以解决问题。
修改强>
现在我得到它,ReturnProject
属性在LdapAuthentication.cs中声明,而不是在Global.asax中声明。
让我解释一下。每次请求命中服务器时,都会创建HttpApplication
的新实例(因此,HttpContext
实例属性)。通过这种方式,您可以访问Request
和Session
- 它们与具体用户相关的具体请求绑定。相关回答:“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");
}
}