2009-05-26 6 views
1

У меня есть два вопроса:Global.asax, глобальные переменные и редактирование с кодом

1) У меня есть несколько глобальных переменный для моего сайта, объявленных в моем global.asax файла. Они простые, маленькие пары ключ/значение, и их лишь несколько. Является ли это хорошей практикой для небольших значений и к ним нужно обращаться почти на каждой странице моего веб-сайта? Хранение их в базе данных и необходимость поиска db кажутся такими, что считается, что они будут тратить ресурсы на ценности, которые не изменяются быстро.

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. См. here и here для некоторых руководств.

2) a) Если вы храните это в файле web.config, это будет легко обновляться без необходимости перекомпиляции, и веб-приложение должно немедленно забрать изменения.

b) Нужно ли обновлять что-то вроде «номера недели» вручную? Это звучит немного с ошибкой, и я бы предложил автоматизировать это, если это вообще возможно, вычислив его на основе текущей даты.

+0

Похоже, что вы можете указать номер недели на дату, но это проблематично, когда определенная работа задерживается, тем самым предотвращая рутинное изменение недели. К сожалению, я хочу, чтобы пользователь решил точное время, чтобы изменить неделю. – wrburgess

0

Другие ответы предлагают разные способы сделать это, и это необходимо сделать. Но даже если вы хотите разрешить пользователю редактировать глобальную переменную, вам нужно будет заблокировать или Mutex на общем объекте, изменить значение вашей глобальной переменной и отпустить блокировку или Mutex.

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 коллекция, простая сводная икота обмена, может быть здесь полезной, это быстро, и это не -deadlock guarntee.

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>