2

似乎CompilationMode=Never不允许正确连接 Sessions。

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

将System.Web.SessionState.IRequiresSessionState显式分配给页面 [1] 可避免空引用异常(围绕 .Session 访问),但仍不能正确保留或连接会话。

有没有人成功使用过CompilationMode=Never的 ASP.NET 会话?

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

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

4

1 回答 1

2

我不知道您所处的确切情况,但您所说的是正确的 - 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"

于 2010-01-15T14:15:19.977 回答