Доступ к переменным сеанса из метода 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.