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

  • Вопрос

  • Продукт работает на всем вплоть до XP с IIS5 и на сегодняшний день известны только два сетапа на которых выявлена эта проблема. Сервера на IIS7 запущены на w2k8 параллельно установлен SharePoint.

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

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

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

    В проекте есть 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>

    однако это никак не повлияло на ситуацию. Возможно, у кого-нибудь есть идеи, что происходит, куда смотреть и как это исправить?

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

    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) // дальше работать нет смысла

    12 декабря 2012 г. 13:04

Ответы

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