2009-05-26 68 views
1

編輯我有兩個問題:Global.asax中,全局變量,並用代碼

1)我在的Global.asax文件中聲明爲我的網站的幾個全局變量。它們是簡單的,小的鍵/值對,並且只有少數幾個。這是一個很好的習慣,對於那些小而且需要被我網站上幾乎所有頁面訪問的值?將它們存儲在數據庫中並要求進行數據庫查找似乎認爲它會浪費不會快速變化的值的資源。

2)如果其中一個值每週更改一次,是否可以允許用戶使用窗體或其他方式編輯全局變量?

實施例:

<script runat="server"> 

    Overloads Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) 

     Application("default_scoring_id") = 3 
     Application("week_current") = 3 

    End Sub 

</script> 

在上面的例子中,系統需要知道哪個周(在它們中的15)內的當前日期是內。因此,每星期一上午一次,「week_current」值需要改變。

我可以很容易地做到這一點,但有沒有辦法讓用戶訪問更改此值而無需觸摸代碼?

回答

2

典型的做法是將這些放入可以編輯的web.config中。這些<appSettings>值將在每個頁面上可用,但該文件可以被編輯。

1

我會考慮使用內置的緩存(的System.Web.Caching.Cache)

這樣,你可以存儲它們在任何你想要的(比如在數據庫中),他們從應用程序內輕易改變,並且具有快速且便宜的檢索。

從繼承自BasePage的類中使用給定的Cache對象(例如Cache.Add(..))並從別處使用HttpContext.Current.Cache(例如HttpContext.Current.Cache.Remove(Key))

1

1)好的做法通常是將這些值存儲在web.config中。有關指南,請參閱herehere。 2)a)如果你把它存儲在web.config中,它將很容易更新而不需要重新編譯,並且web應用程序應該馬上接受更改。

b)是否需要更新類似'星期號碼'的手動過程?這聽起來有點容易出錯,我會建議自動化,如果有可能的話,可以根據當前日期進行計算。

+0

看起來你可以以日期爲基礎的星期數,但是當某些工作被延遲時,這是有問題的,從而防止了例行的星期變化。不幸的是,我需要讓用戶決定改變這一週的確切時間。 – wrburgess 2009-05-26 03:39:01

0

其他答案表明這可以做不同的方式,必須完成。但即使如此,如果您想允許用戶編輯全局變量,則必須在共享對象上執行鎖定或互斥鎖,更改全局變量的值並釋放鎖定或互斥鎖。

lock(globalsharedobject) //This is C# code. 
{ 
    Application("default_scoring_id") = 3; 
} 
0

Web.config是.NET方式或ASP.NET方式,它並不總是最有效率或最合適的。

你是Global.asax文件比一些事件多得多,你可以將靜態數據放在子類System.Web.HttpApplication的任何類中,並在Global.asax文件中繼承它。

HttpSessionState和HttpApplicationState是來自傳統ASP時間的遺蹟,並且您應該避免它們,因爲沒有真正的目的。

根據您可以設計存儲有關您的應用程序和會話信息,應用級數據你自己的強類型對象一堆靜態字段就足夠了你的對象類型(的System.Type)。

它們必須是靜態的,因爲每個HttpModule以及HttpApplication實例都是池對象,因此爲了避免混淆,請確保持久數據存儲在靜態或多個靜態dicionaries中。但在實現這些集合時要注意併發性問題。一個好的策略是鎖定對象,只有在你修改它的時間內,並確保你不調用任何其他代碼的時候,modyfiny集合,一個簡單的交換習慣用法,在這裏可能會有所幫助,它很快,而且不是 - 不受信任的警察。

0
<%@ Application Language="C#" %> 

<script runat="server"> 

    void Application_Start(object sender, EventArgs e) 
    { 
    // Code that runs on application startup 

    } 

    void Application_End(object sender, EventArgs e) 
    { 
    // Code that runs on application shutdown 

    } 

    void Application_Error(object sender, EventArgs e) 
    { 
    // Code that runs when an unhandled error occurs 

    } 

    void Session_Start(object sender, EventArgs e) 
    { 

    // Code that runs when a new session is started 

    } 

    void Session_End(object sender, EventArgs e) 
    { 
    // Code that runs when a session ends. 
    // Note: The Session_End event is raised only when the sessionstate mode 
    // is set to InProc in the Web.config file. If session mode is set to StateServer 
    // or SQLServer, the event is not raised. 

    } 
    protected void Application_BeginRequest(Object sender, EventArgs e) 
    { 
    Context.Items.Add("Request_Start_Time", DateTime.Now); 
    } 
    protected void Application_EndRequest(Object sender, EventArgs e) 
    { 
    TimeSpan tsDuration = DateTime.Now.Subtract((DateTime)Context.Items["Request_Start_Time"]); 
    Context.Response.Write("<b>Request Processing Time: From Global.asax file " + tsDuration.ToString()); 
    Application["time"] = tsDuration.ToString(); 
    } 

</script>