CompilationMode=Never & SessionState

Кажется, что CompilationMode= Никогда не позволяет сеансам быть правильно подключенными.

Сначала он жалуется, что директива EnbaleSessionState не разрешена на этой странице.

Явное присвоение System.Web.SessionState.IRequiresSessionState странице [1] позволяет избежать исключений с нулевой ссылкой (вокруг доступа к сеансу), но все еще не обеспечивает правильного сохранения или подключения сеансов.

Кто-нибудь успешно использовал сессии ASP.NET с CompilationMode= Никогда?

Концептуально, почему они должны быть непересекающимися?

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

1 ответ

Решение

Я не знаю точную ситуацию, в которой вы находитесь, но то, что вы говорите, правильно - 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 бессмысленным и, следовательно, отключенным.

Другие вопросы по тегам