从IHttpModule的OnBeginRequest方法访问会话变量

时间:2012-10-03 23:42:07

标签: c# asp.net session-variables ihttpmodule

我有一个网站,为了正常工作,需要在其所有网址上附加一个XML文件,假设该文件名为module-1.xml

为了保持这些URl的清洁,我编写了一个IHttpModule,它使用HttpContext.Current.RewritePathOnBeginRequest事件中执行追加作业。

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");
    }
}

From what I have found,可以在模块内访问会话 不是来自OnBeginRequest事件内部,这是唯一可以使HttpContext.Current.RewritePath起作用的事件(至少从我一直在做的所有测试中)。

我的假设是否正确?如果是,我可以使用哪种替代方案?创建自定义Session变量?我应该从txt文件还是数据库中读取以了解用户正在查看的模块?如何从模块中跟踪用户?

2 个答案:

答案 0 :(得分:1)

这取决于您的应用程序所需的安全性。如果您不关心恶意用户是否能够更改该值,只需将模块名称存储在cookie中即可。如果这样做,您可以在cookie中存储安全生成的标识符,并在数据库中查找以获取您需要使用的值。

答案 1 :(得分:1)

完全摆脱模块。您只是将它附加到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中的风险。