似乎 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
答案 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 ”没有意义,因此被禁用。