CompilationMode = Never& SessionState的

时间:2009-12-02 21:16:24

标签: asp.net session-state compilationmode

似乎 CompilationMode =从不不允许正确连接会话。

首先抱怨此页面上不允许使用 EnbaleSessionState 指令。

明确地将 System.Web.SessionState.IRequiresSessionState 分配给Page [1]可以避免空引用异常(围绕.Session访问),但仍然无法正确保留或连接会话。

是否有人使用 CompilationMode = Never 成功使用了ASP.NET会话?

从概念上讲,为什么这些是不相交的?

[1] - http://msdn.microsoft.com/en-us/library/system.web.ui.compilationmode.aspx

1 个答案:

答案 0 :(得分:2)

我不知道你所处的确切情况,但你说的是正确的 - Page + IRequiresSessionState =会议可用。这是你做的。首先为您的页面定义一个基类,它将接收会话状态:

public class BasePage : Page, IRequiresSessionState
{
}

然后在NoCompile页面中执行以下声明:

<%@ Page Language="C#" CompilationMode="Never" Inherits="BasePage" %>

按预期工作。会话状态可用。现在关于你的第二个问题了解更多:“从概念上讲,为什么这些问题应该脱节?” 默认情况下页面

public class Page : TemplateControl, IHttpHandler
{
}

类没有实现IRequiresSessionState,因此没有会​​话状态。 ASP.NET为您做的是在运行时为您编译一个类,通过它为它提供会话 - 即如果我定义了一个名为Default.aspx的页面,其后面的代码实现了Page,那么我没有明确地实现 IRequiresSessionState < / strong>即可。但是ASP.NET将我们的Default.aspx UI编译成一个名为:

的类
public class default_aspx : Default, IRequiresSessionState, IHttpHandler
{
}

现在明确表示它希望传递会话状态。这是因为 @Page 指令中的“ EnbaleSessionState ”默认设置为True。现在当你通过指定CompilationMode="Never"说default.aspx是一个非编译单元时,那么这个类永远不会生成,你永远不会得到会话状态,这会使用“ EnbaleSessionState ”没有意义,因此被禁用。