IHttpModule и Session
От: Михаил Евгеньевич  
Дата: 03.07.07 14:01
Оценка:
Имеется проблемка:
Делаю обработчик событий приложения. Начальство приказало убрать все из Global.asax в отдельный модуль. Делаю

public class ErrorModule : IHttpModule
    {
        public void Init(HttpApplication application)
        {
            application.Error += new EventHandler(application_Error);
        }
        public void application_Error(object sender, EventArgs e)
        {
            HttpApplication app = (HttpApplication)sender;    
            System.Web.SessionState.HttpSessionState Session = HttpContext.Current.Session;

            Exception exception = app.Server.GetLastError();

            if (null != exception)
            {
                Session[ErrorHelperStrings.BackUrl] = app.Request.UrlReferrer;
                Session[ErrorHelperStrings.ErrorMessage] = exception.Message;
                Session[ErrorHelperStrings.Exception] = exception;
            }
            app.Server.Transfer("~/ErrorPage.aspx");
        }

После трансфера на страничку ошибки берем сохраненные данные из сессии и выдаем отчет. Самое веселое начинается потом. На той страничке есть кнопочка возврата на страницу, где произошла ошибка. Когда на нее нажимаем и смотрим дебаггер — сессия пуста. Если убрать app.Server.Transfer из вышеприведенного кода то вообще никакие данные до страницы ошибки не дойдут.
Но это еще не всё
Если где-нить на Default.aspx поставить строчку Session["tra-ta-ta"] = "qwe" и уже потом баловаться с обработкой ошибок — сессия при обновлении ErrorPage не стирается, т.е. все работает как задумывалось.
Вопрос: где зарыта собака?
RE: IHttpModule и Session
От: Аноним  
Дата: 03.07.07 14:02
Оценка:
См. интерфейс IRequiresSessionState
Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.


Данное сообщение получено с сайта www.aspnetmania.com
IHttpModule и Session
От: Аноним  
Дата: 03.07.07 17:04
Оценка:
Возможно навру, т.к. точно не знаю просто есть идеи которые надо еще проверить.

1)Сессия скорее всего цепляется у тебя на основе сециальных кук. app.Server.Transfer — ты прерываешь выполнение текущего процеса и что у тебя происходит с сессионными куками непонятно. Отсюда и проблемы.

2)Dimon а IRequiresSessionState разве имеет отношение к модулю? на сколько я знаю это "метка" на хендлер.
От хаоса в космос и далее к наличным


Данное сообщение получено с сайта www.gotdotnet.ru
Re: IHttpModule и Session
От: Михаил Евгеньевич  
Дата: 04.07.07 06:21
Оценка:
Это все понятно, но делать-то что?
Смотрю в дебаггер: SessionId не меняется по ходу работы (мб он сохраняется где-то в кукисах), зато когда нажимаю кнопку возврата и начинаю смотреть отладчик, оказывается, что IsNewSession стоит в true. Т.е. после обработки ошибки и показа страницы сессия убивается
Re: IHttpModule и Session
От: Аноним  
Дата: 04.07.07 02:44
Оценка:
смотри какой тынц.
http://weblogs.asp.net/bleroy/archive/2004/08/03/Don_2700_t-redirect-after-setting-a-Session-variable-_2800_or-do-it-right_2900_.aspx

а на вопрос что делать — то попробуй писать в аппликешин. ключом можно взять случайное число или хеш исключения. на страницу с ошибкой редиректить с параметром значением этого ключа. На странице с ошибкой читать и удалять из аппликешина. только если будут ошибки на пути к странице ошибок апликешин забьется мусором.
От хаоса в космос и далее к наличным


Данное сообщение получено с сайта www.gotdotnet.ru
Re: IHttpModule и Session
От: FLUID Украина http://yuriy-okhmat.blogspot.com/
Дата: 05.07.07 16:52
Оценка:
Попробовал смоделировать ситуацию — все ок, значения в сессии пришли на CustomError.aspx.

    public class ErrorModule: IHttpModule
    {
        public void Dispose()
        {
        }

        public void Init(HttpApplication context)
        {
            context.Error += new EventHandler(OnApplicationError);
        }

        private void OnApplicationError(object sender, EventArgs e)
        {
            HttpApplication currentApplication = sender as HttpApplication;
            if(currentApplication != null)
            {
                HttpContext context = HttpContext.Current;
                if (context != null)
                {
                    HttpSessionState session = context.Session;
                    Exception lastException = context.Server.GetLastError();
                    context.Server.ClearError();

                    if (lastException != null)
                    {
                        session["Referrer"] = context.Request.UrlReferrer.AbsoluteUri;
                        session["ErrorMessage"] = lastException.Message;
                        session["Stack"] = lastException.StackTrace;
                    }
                    context.Server.Transfer("CustomError.aspx", false);
                }
            }
        }
    }


вот собсно CustomError.aspx code-behind, так вот значения как сюда доходят как и при возврате на referenced page остаются в сессии:

public partial class CustomError : System.Web.UI.Page
{
    private String ErrorMessage
    {
        get
        {
            String message = String.Empty;
            if (Session["ErrorMessage"] != null)
                message = Session["ErrorMessage"] as String;
            return message;
        }
    }

    public String Stack
    {
        get
        {
            String stack = String.Empty;
            if (Session["Stack"] != null)
                stack = Session["Stack"] as String;
            return stack;
        }
    }

    public String Referrer
    {
        get
        {
            String referrer = String.Empty;
            if (Session["Referrer"] != null)
                referrer = Session["Referrer"] as String;
            return referrer;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write(ErrorMessage);
        Response.Write("<br/>");
        Response.Write(Stack);
        this.back.PostBackUrl = Referrer;
    }
}


... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Мы не владеем тем, чего мы не понимаем....
Re: IHttpModule и Session
От: FLUID Украина http://yuriy-okhmat.blogspot.com/
Дата: 12.07.07 08:49
Оценка:
Попробовал смоделировать ситуацию — все ок, значения в сессии пришли на CustomError.aspx.

    public class ErrorModule: IHttpModule
    {
        public void Dispose()
        {
        }

        public void Init(HttpApplication context)
        {
            context.Error += new EventHandler(OnApplicationError);
        }

        private void OnApplicationError(object sender, EventArgs e)
        {
            HttpApplication currentApplication = sender as HttpApplication;
            if(currentApplication != null)
            {
                HttpContext context = HttpContext.Current;
                if (context != null)
                {
                    HttpSessionState session = context.Session;
                    Exception lastException = context.Server.GetLastError();
                    context.Server.ClearError();

                    if (lastException != null)
                    {
                        session["Referrer"] = context.Request.UrlReferrer.AbsoluteUri;
                        session["ErrorMessage"] = lastException.Message;
                        session["Stack"] = lastException.StackTrace;
                    }
                    context.Server.Transfer("CustomError.aspx", false);
                }
            }
        }
    }


вот собсно CustomError.aspx code-behind, так вот значения как сюда доходят как и при возврате на referenced page остаются в сессии:

public partial class CustomError : System.Web.UI.Page
{
    private String ErrorMessage
    {
        get
        {
            String message = String.Empty;
            if (Session["ErrorMessage"] != null)
                message = Session["ErrorMessage"] as String;
            return message;
        }
    }

    public String Stack
    {
        get
        {
            String stack = String.Empty;
            if (Session["Stack"] != null)
                stack = Session["Stack"] as String;
            return stack;
        }
    }

    public String Referrer
    {
        get
        {
            String referrer = String.Empty;
            if (Session["Referrer"] != null)
                referrer = Session["Referrer"] as String;
            return referrer;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write(ErrorMessage);
        Response.Write("<br/>");
        Response.Write(Stack);
        this.back.PostBackUrl = Referrer;
    }
}


... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Мы не владеем тем, чего мы не понимаем....
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.