我不知道您所处的确切情况,但您所说的是正确的 - Page + IRequiresSessionState = Session Available。这就是你要做的。首先为您的页面定义一个基类,它将接收会话状态:
public class BasePage : Page, IRequiresSessionState
{
}
然后在您的 NoCompile Page 中执行以下声明:
<%@ Page Language="C#" CompilationMode="Never" Inherits="BasePage" %>
按预期工作。会话状态可用。现在,关于您的第二个问题的更多信息:“从概念上讲,为什么这些应该是不相交的??”。默认情况下页面
public class Page : TemplateControl, IHttpHandler
{
}
类没有实现 IRequiresSessionState,因此没有会话状态。ASP.NET 为您做的是在运行时为您编译一个类,它通过它提供会话 - 即,如果我定义一个名为 Default.aspx 的页面,其代码位于实现 Page 的类后面,而我在任何地方都没有显式实现IRequiresSessionState。但是 ASP.NET 将我们的 Default.aspx UI 编译成一个名为的类:
public class default_aspx : Default, IRequiresSessionState, IHttpHandler
{
}
现在明确表示它希望传递会话状态。这是因为@Page指令中的“ EnbaleSessionState ”默认设置为 True。现在,当您通过指定说 default.aspx 是非编译单元时,则永远不会生成此类并且您永远不会获得会话状态,这使得“ EnbaleSessionState ”的使用没有意义,因此被禁用。CompilationMode="Never"