Я не знаю точную ситуацию, в которой вы находитесь, но то, что вы говорите, правильно - Page + IRequiresSessionState = Session Available. Вот что ты делаешь. Сначала определите базовый класс для ваших страниц, которые будут получать состояние сеанса:
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 . Но ASP.NET компилирует наш пользовательский интерфейс Default.aspx в класс с именем:
public class default_aspx : Default, IRequiresSessionState, IHttpHandler
{
}
, который теперь явно говорит, что он хочет, чтобы состояние сеанса было доставлено. Это связано с тем, что " EnbaleSessionState " в директиве @ Page по умолчанию имеет значение True. Теперь, когда вы говорите, что default.aspx - это некомпилируемая единица с указанием CompilationMode="Never"
, тогда этот класс никогда не генерируется, и вы никогда не получите состояние сеанса, что делает использование « EnbaleSessionState » бессмысленным и таким образом отключен.