Доступ к переменным сеанса из метода OnBeginRequest IHttpModule

У меня есть веб-сайт, который для правильной работы должен иметь файл XML, добавленный ко всем его URL-адресам, скажем, файл называется module-1.xml,

Чтобы сохранить эти URls чистыми, я написал IHttpModule, который использует HttpContext.Current.RewritePath сделать добавочную работу внутри OnBeginRequest событие.

IHttpModule выглядит довольно просто и работает:

public void OnBeginRequest(Object s, EventArgs e)
{
   string url = HttpContext.Current.Request.Url.AbsolutePath;
   if (url.EndsWith(".aspx"))
      HttpContext.Current.RewritePath(url + "?module-1.xml");
}

Теперь я хотел использовать переменную сеанса, чтобы определить, когда пользователь решает переключить веб-сайт с model-1.xml в model-2.xml и изменили мой код следующим образом:

public void OnBeginRequest(Object s, EventArgs e)
{
   string url = HttpContext.Current.Request.Url.AbsolutePath;
   if (url.EndsWith(".aspx"))
   {
      if (HttpContext.Current.Session["CurrentMode"] == "1")
         HttpContext.Current.RewritePath(url + "?module-1.xml");
      else if(HttpContext.Current.Session["CurrentMode"] == "2")
         HttpContext.Current.RewritePath(url + "?module-2.xml");
    }
}

Из того, что я нашел, сеанс может быть доступен внутри модуля, но не изнутри OnBeginRequest событие, которое является единственным событием, где HttpContext.Current.RewritePath можно сделать работоспособным (по крайней мере, из всех испытаний, которые я проводил).

Правильно ли мое предположение? И если это так, какую альтернативу я могу использовать? Создать пользовательскую переменную Session? Стоит ли читать из txt-файла или из БД, чтобы узнать, на какой модуль смотрит пользователь? Как я могу отслеживать пользователя из модуля?

2 ответа

Решение

Это зависит от безопасности, требуемой вашим приложением. Если вам не важно, что злонамеренный пользователь может изменить значение, просто сохраните имя модуля в файле cookie. Если вы это сделаете, вы можете сохранить надежно сгенерированный идентификатор в cookie-файле и найти его в базе данных, чтобы получить значение, которое вам нужно использовать.

Избавьтесь от модуля полностью. Вы только прикрепляете его к страницам aspx, поэтому нет необходимости, чтобы это было в URL. Вместо этого просто создайте базовую страницу для страниц вашего проекта для наследования:

public class Solution.Web.UI.Page : System.Web.UI.Page
{
    public string CurrentMode 
    { 
        get { return String.Compare(Session["CurrentMod"].ToString(), "1") == 0) ? "module-1.xml" : "module-2.xml"; }
    }
}

Таким образом, вы можете просто получить к нему доступ на своих страницах без дополнительных затрат этого модуля или риска помещения этой информации в файл cookie.

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