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 бессмысленным и, следовательно, отключенным.