c#如何从preinit设置和使用会话状态

c#如何从preinit设置和使用会话状态,c#,asp.net,session-state,C#,Asp.net,Session State,好的,从当前会话中设置和读取变量 String Myvar =(string) System.Web.HttpContext.Current.Session[“MyVariable”] 设置 System.Web.HttpContext.Current.Session[“MyVariable”] = “NewValue” 我两者都做不到,我从System.Web.HttpContext.Current.Session获得一个System.NullReferenceException:对象引用

好的,从当前会话中设置和读取变量

String Myvar =(string) System.Web.HttpContext.Current.Session[“MyVariable”]
设置

System.Web.HttpContext.Current.Session[“MyVariable”] = “NewValue”
我两者都做不到,我从System.Web.HttpContext.Current.Session获得一个
System.NullReferenceException:对象引用未设置为对象的实例。

在我的web.config中,我有

<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" timeout="20">
</sessionState>  

我已经读了十几篇关于
IHttpHandler
iRequiresessionState
接口必要性的文章。我认为问题可能是因为我在
Page\u PreInit
中请求此信息。我在一篇堆栈溢出文章中发现了一个,但我似乎没有正确地使用它来实现这一点


我不确定我错过了什么。提前感谢。

正如前面提到的评论,在
PreInit
事件中,您有什么理由需要它吗

PreInit
发生在页面生命周期的早期。事实上,它发生在母版页(如果有的话)应用之前,在所有控件完全初始化之前,等等


对于大多数应用程序来说,更好的选择是
Load
事件。如果您仍然在那里得到一个
NullReferenceException
,那么还有一个更大的问题。

要访问会话状态pre init,您可以执行以下操作。我使用它,这样我就可以有一个不同于普通用户的管理主机。每个页面的顶部都有一个方法

PageTools tools = new PageTools();
protected void Page_PreInit(object sender, EventArgs e)
{
    tools.setMasterPage(Page, Context);
}
PageTools是我的类,它包含选择适当的主页面并具有http处理程序的方法

public void setMasterPage(Page page, HttpContext context)
    /***********************************************************************
     * Author   Daniel Tweddell
     * Date     9/18/09
     * 
     * Several of the pages are for non-admin use, however these pages will
     * also be used by the admin users and will need to have the admin menu
     * and such.  So based on the login, we either show the page with the
     * standard master or if the user is admin, use the admin master.
     ***********************************************************************/
    {
        if (context.Handler is IReadOnlySessionState || context.Handler is IRequiresSessionState)
        {
            context.Handler = Handler();
        }
        String sMasterPage="~/content/page.master";
        if (userinfo.IsUserAdmin) sMasterPage="~/content/administrator/admin.master";//make sure the user is admin
        page.MasterPageFile = sMasterPage; 
    }

是设置httphandler的一步一步的过程。(这是您需要的另一件事。

您可以通过在类中实现IRequiresessionState接口来访问会话

这是一个标志接口,因此不需要实现任何额外的代码

当您实现此功能时,asp.net将知道您想要访问会话

public partial class YOUR_ASPX: System.Web.UI.Page , IRequiresSessionState
{

... your code

}

如果将该代码移动到Page_Load事件中,它会工作吗?为什么需要在PreInit中使用该代码?请确保ASP.Net状态服务已启动。即使将代码放置在Page_PreInit中,它也会工作。您可以提供更多信息吗?还有一件事,您首先使用哪一行。如果您尚未设置会话[“MyVariable”]并尝试强制转换到(字符串)。它将给您提供空引用错误。因此,请尝试在强制转换之前设置空检查条件。我正在交换母版页-在PreInit上是我唯一知道如何执行此操作的地方。我认为我确实需要在PreInit中执行此操作。我不能访问该点的状态吗?我知道我可以通过问题中链接的解决方案来执行此操作。不幸的是,我缺少som这一难题的一小部分需要实现。对于交换母版页,是的,你需要在PreInit进行。然而,交换母版页依赖于会话状态。除了会话状态之外,还有其他机制可以用来获取交换母版页所需的信息吗?它基于在login。我想我可以通过post和隐藏变量将信息从一页传递到另一页,但是……糟糕。我会将所有用户信息保存在状态中,就像史前传递一样。