0

我有一个网站,为了正常工作,需要在其所有 URL 上附加一个 XML 文件,假设该文件名为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");
}

现在,我想使用 session 变量来检测用户何时决定将网站从 切换model-1.xmlmodel-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可以使其起作用的事件(至少从我一直在做的所有测试中)。

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

4

2 回答 2

1

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

于 2012-10-03T23:52:27.103 回答
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 的风险。

于 2012-10-04T03:18:22.697 回答