我有一个网站,为了正常工作,需要在其所有网址上附加一个XML文件,假设该文件名为module-1.xml
。
为了保持这些URl的清洁,我编写了一个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");
}
}
From what I have found,可以在模块内访问会话
不是来自OnBeginRequest
事件内部,这是唯一可以使HttpContext.Current.RewritePath
起作用的事件(至少从我一直在做的所有测试中)。
我的假设是否正确?如果是,我可以使用哪种替代方案?创建自定义Session变量?我应该从txt文件还是数据库中读取以了解用户正在查看的模块?如何从模块中跟踪用户?
答案 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中的风险。