2012-10-03 47 views
0

我有一個網站,爲了正常工作,需要將XML文件附加到它的所有URL,我們假設該文件被稱爲module-1.xml從IHttpModule的OnBeginRequest方法訪問會話變量

爲了保持這些URLS乾淨,我寫了一個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事件這是唯一的事件,其中內部可以使功能化(至少從我一直在做的所有測試中)。

我的假設是否正確?如果是,我可以使用什麼替代方案?創建一個自定義的Session變量?我應該從txt文件還是從數據庫讀取數據,以瞭解用戶正在查看的模塊?我如何跟蹤模塊內的用戶?

回答

1

這取決於您的應用程序所需的安全性。如果您不關心惡意用戶能夠更改該值,只需將模塊名稱存儲在cookie中即可。如果這樣做,可以將安全生成的標識符存儲在cookie中,然後在數據庫中查看以獲取需要使用的值。

+0

好主意,謝謝! – jdecuyper

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中的風險。

+0

謝謝,但我仍然需要將xml文件追加到所有的aspx文件,具體取決於會話內部的值... – jdecuyper

+0

出於好奇,將它附加到URL會做什麼? –

+0

我們在連接到OPC服務器的所有頁面上都有控件並顯示實時數據。不幸的是,使所有這些控件工作的唯一方法是通過URL移交一個XML文件。這是一個痛苦,但沒有辦法繞過它,這是我們公司的第三方產品協議,我們必須活下去......現在:) – jdecuyper