none
HttpContext.Current.Session is null in MasterPage Init_Page RRS feed

  • Вопрос

  • Хочу сразу заметить, что ситуация возникла совсем недавно на IIS 7 с w2k8 и с чем она связана я так и не смог выяснить. Продукт работает на всем вплоть до XP с IIS5 и на сегодняшний день известны только два сетапа на которых выявлена эта проблема.

    Страницы продукта построены  на общем MasterPage в коде которого подготовление данных происходит в методе Page_Init. Согласно документации он вызывается до Page_Init/Load дочерней страницы, что, собственно, меня очень устраивает.

    В MasterPage есть static свойство, данные в котором инициализируются и хранятся далее в текущей сессии, доступ к которой я осуществляю через HttpContext.Current.Session. Это статическое свойство используется при отработке Page_Init метода MasterPage.

    Так вот, конкретно на двух сетапах по непонятной причине HttpContext.Current.Session == null при этом HttpContext.Current не нулевой. То есть контекст присутствует, но сессии не инициализированы. Работу в этом случае я продолжать не могу и продукт завершает ее аварийно.

    Настройки сессий в порядке, никаких других паталогий я обнаружить так же не смог. 

    У кого-нибудь есть идеи, что происходит, куда смотреть и как это исправить?

    На всякий случай оставлю фрагменты кода:

    namespace WebPortal
    {
    	public partial class DRWeb : System.Web.UI.MasterPage
    	{
    ....
    		/// <summary>
    		/// Get language translator for current session
    		/// </summary>
    		protected static Translator translator {
    			get
    			{
    				if (HttpContext.Current != null)
    				{
    					if (HttpContext.Current.Session != null)
    					{
    						var obj = HttpContext.Current.Session["Translator"];
    						if (obj == null)
    						{
    							// creating new translator
    							...
    							HttpContext.Current.Session["Translator"] = obj;
    						}
    						return obj as Translator;
    					}
    					else
    					{
    						throw new Exception("HttpContext.Current.session is null here!"); // имеем ошибку тут!
    					}
    				}
    				else
    				{
    					throw new Exception("HttpContext.Current is null here!");
    				}
    			}
    		}
    ...
    		protected void Page_Init(object sender, EventArgs e) {
    			if (IsPostBack == false)
    			{
    				// check for login credentials
    				CheckLoginCredentials();
    				// resetting defaults
    				DRBodyAttrs = "";
    				// init languages
    				if (translator.Connect(connStrLanguageDb) == false) // дальше работать нет смысла
    

    5 декабря 2012 г. 17:53

Ответы

  • Думаю я нашел ответ. SharePoint запрещает использовать сессии. Здесь есть детали как это обойти http://nikspatel.wordpress.com/2012/02/12/enable-asp-net-session-state-on-sharepoint-2010-application/ 
    • Помечено в качестве ответа Alexander N. Voronin 13 декабря 2012 г. 11:29
    13 декабря 2012 г. 11:29

Все ответы

  • Интересный кусок у Вас тут:

    if (HttpContext.Current != null)
    				{
    					if (HttpContext.Current.Session != null)
    					{
    						var obj = HttpContext.Current.Session["Translator"];
    						if (obj == null)
    						{
    							// creating new translator
    							...
    							HttpContext.Current.Session["Translator"] = obj;
    						}
    						return obj as Translator;
    					}
    					else
    					{
    						throw new Exception("HttpContext.Current.session is null here!"); // имеем ошибку тут!
    					}
    				}

    А где гарантии, что obj не null? Покажите этот кусок тоже.

    5 декабря 2012 г. 18:18
    Модератор
  • Значение obj не играет никакой роли, хотя и проверяется. Этот код выполняет throw после проверки HttpContext.Current.Session != null. Собственно это основная проблема. С какого-то перепугу в MasterPage.Page_Init сессия нулевая, чего не может случиться никак по определению, если я, конечно, не пропустил какой-нибудь сноски в документации.
    6 декабря 2012 г. 9:33
  • Да, моя вина не доглядел. Наверно проблема не в самом приложении, а во внешних факторах. Например выставлен малый таймаут сессии хотя это мало вероятно. Или может домен-приложения перезапускается по причине каких-нибудь сбоев на сервере в IIS, по Вашему описанию это происходит на одном только сервере.
    6 декабря 2012 г. 9:48
    Модератор
  • Привет.

    Копайте в сторону настроек веб-сервера все что связано с сессиями, точный ответ вам врядли кто скажет не имея доступа к самому серверу. Поэтому пробуйте различные значение, проверяйте конфиги, сравнивайте с работающими инстансами и тп.


    Для связи [mail]

    12 декабря 2012 г. 9:37
    Модератор
  • Собственно интересует в какую сторону еще можно копать? Дело в том, что я уже перекопал все, что знаю. Еще из забавного. В проекте есть Global.asax и по dbgview я отследил порядок некоторых вызовов. Вот что происходит при нормальной работе приложения:

    [6208] Global.Application_Start 
    [6208] Global.Application_BeginRequest 
    [6208] Global.Application_AuthenticateRequest 
    [6208] Global.Session_Start a3qxxabosaa1qvi34zvuv445 
    [6208] MasterPage.Page_Init 
    [6208] MasterPage.Page_Load 

    А вот, каков порядок вызовов на проблемном сервере:

    00010935 328.38235474 [5872] Global.Application_Start  
    00010950 328.44219971 [5872] Global.Application_BeginRequest  
    00010951 328.44232178 [5872] Global.Application_AuthenticateRequest  
    00010952 328.49069214 [5872] MasterPage.Page_Init  
    00010953 328.49200439 [5872] Global.Application_Error  
    00018569 554.83990479 [5872] Global.Application_End  

    Как видно из лога, на проблемном сервере напрочь отсутствует вызов Session_Start. Хотелось бы услышать Ваше мнение на этот счет. Настройки session state стандартные inproc. Уже не помню по чьему совету, но я даже добавил удаление и добавления модуля Session в Web.config:

    <modules>
    	<remove name="Session" />
    	<add name="Session" type="System.Web.SessionState.SessionStateModule"/>
    </modules>
    

    Однако это тоже не помогло. На этом идеи у меня закончились.

    12 декабря 2012 г. 9:48
  • У Вас есть доступ к этому серверу? Может Ваш web.config туда не доходит или не используется или кто-то там их переопределяет?
    12 декабря 2012 г. 9:56
    Модератор
  • Доступ есть и web.config на нем редактировался и правился не однократно в попытках достигнуть работоспособности. На данный момент мои идеи просто иссякли.. :)
    12 декабря 2012 г. 10:05
  • Попробуйте так. Создайте простенькое приложения, запустите его на этом сервере и посмотрите работает ли в этом случае сессия. Если будет работать, значит дело точно в настройках вашего приложения. Если не будет, значит проблема в насторйках корневых файлов конфигурации сервера.
    12 декабря 2012 г. 11:08
    Модератор
  • Не работает. Дело точно в настройках. Неужели в нет специалистов, способных однозначно ответить на этот вопрос или хотя бы посоветовать вменяемую диагностику? Это все похоже на анекдот про автомобилистов "по колесу постучали, под капот заглянули.." :)
    12 декабря 2012 г. 12:13
  • "Не работает. Дело точно в настройках." - что именно? Определённого алгоритма выявления проблем нет. Нужно сделать так как сказал Дмитрий. У Вас наверное не запускается модуль сессии.
    12 декабря 2012 г. 12:18
    Модератор
  • Попробуйте продублировать свой вопрос, с большим описанием проблемы и меньшим кодом, т.к. он верен, в форуме Internet Information Services (IIS)

    Для связи [mail]


    12 декабря 2012 г. 12:28
    Модератор
  • Что именно "что именно"?
    12 декабря 2012 г. 12:31
  • Не работает новое приложение тоже?
    12 декабря 2012 г. 12:32
    Модератор
  • Думаю я нашел ответ. SharePoint запрещает использовать сессии. Здесь есть детали как это обойти http://nikspatel.wordpress.com/2012/02/12/enable-asp-net-session-state-on-sharepoint-2010-application/ 
    • Помечено в качестве ответа Alexander N. Voronin 13 декабря 2012 г. 11:29
    13 декабря 2012 г. 11:29
  • Так сразу бы и сазали, что это SharePoint приложение. А я думал у Вас ASP.NET и Вы контролируете всё.
    13 декабря 2012 г. 11:35
    Модератор