Статьи

Установка глобальных объектов в Global.asax

Из запроса форума 🙂

ASP.NET включает в себя файл Global.asax, который предоставляет множество событий всего приложения, которые вы можете использовать для управления выполнением приложения.

Это также позволяет вам определять объекты в глобальном масштабе. Однако, предостережение … поскольку каждая страница на странице ASP.NET работает в своем собственном потоке, вам необходимо убедиться, что ваши объекты являются поточно-ориентированными для нескольких пользователей, запрашивающих ваш сайт.

Почему это важно? Представьте себе 2 запроса от пользователя A и пользователя B. Каждый запрос выполняется в отдельном потоке, и пользователь A манипулирует глобальным объектом в одном потоке, а пользователь B манипулирует одним и тем же объектом в другом потоке. В зависимости от Windows, они могут выполняться в любом порядке … это означает, что ваш глобальный объект не будет синхронизирован для обоих пользователей.

Поэтому, чтобы избежать этой сложности, используйте потокобезопасные объекты или, что представляет особый интерес, используйте хеш-таблицу в качестве потокобезопасного контейнера для ваших переменных:

using System; using System.Collections; namespace MyApp.Collections { public class globalVariableStore{ private Hashtable myCollection; private Hashtable threadSafeCollection; public globalVariableStore() { myCollection = new Hashtable(); threadSafeCollection = Hashtable.Synchronized(myCollection); } public void addVariable(string name, object value) { threadSafeCollection[name] = value; } public object retrieveVariable(string name) { return threadSafeCollection[name]; } } }

using System; using System.Collections; namespace MyApp.Collections { public class globalVariableStore{ private Hashtable myCollection; private Hashtable threadSafeCollection; public globalVariableStore() { myCollection = new Hashtable(); threadSafeCollection = Hashtable.Synchronized(myCollection); } public void addVariable(string name, object value) { threadSafeCollection[name] = value; } public object retrieveVariable(string name) { return threadSafeCollection[name]; } } }

using System; using System.Collections; namespace MyApp.Collections { public class globalVariableStore{ private Hashtable myCollection; private Hashtable threadSafeCollection; public globalVariableStore() { myCollection = new Hashtable(); threadSafeCollection = Hashtable.Synchronized(myCollection); } public void addVariable(string name, object value) { threadSafeCollection[name] = value; } public object retrieveVariable(string name) { return threadSafeCollection[name]; } } }

using System; using System.Collections; namespace MyApp.Collections { public class globalVariableStore{ private Hashtable myCollection; private Hashtable threadSafeCollection; public globalVariableStore() { myCollection = new Hashtable(); threadSafeCollection = Hashtable.Synchronized(myCollection); } public void addVariable(string name, object value) { threadSafeCollection[name] = value; } public object retrieveVariable(string name) { return threadSafeCollection[name]; } } }

using System; using System.Collections; namespace MyApp.Collections { public class globalVariableStore{ private Hashtable myCollection; private Hashtable threadSafeCollection; public globalVariableStore() { myCollection = new Hashtable(); threadSafeCollection = Hashtable.Synchronized(myCollection); } public void addVariable(string name, object value) { threadSafeCollection[name] = value; } public object retrieveVariable(string name) { return threadSafeCollection[name]; } } }

using System; using System.Collections; namespace MyApp.Collections { public class globalVariableStore{ private Hashtable myCollection; private Hashtable threadSafeCollection; public globalVariableStore() { myCollection = new Hashtable(); threadSafeCollection = Hashtable.Synchronized(myCollection); } public void addVariable(string name, object value) { threadSafeCollection[name] = value; } public object retrieveVariable(string name) { return threadSafeCollection[name]; } } }

Затем вы можете определить экземпляр вашего globalVariableStore как глобально ограниченный, добавив строку в ваш файл global.asax:


Теперь вы можете получить доступ к объекту через «myVariables» из любой точки вашего приложения.

Кроме того, вы можете использовать объект Application для хранения переменных, таких как:

Application["myvariable"] = "foo";

Тем не менее, создание ваших собственных глобальных объектов может дать гораздо большую глубину и контроль над глобально определенными экземплярами объектов … просто убедитесь, что они потокобезопасны!

Постоянного хранения

Еще один механизм заключается в добавлении строковых значений в ваш файл web.config, которые затем всегда доступны для вашего приложения:

Это должно быть помещено под элементом «конфигурации» в файле.

Затем вы можете получить значение таким образом:

string connectionString = ConfigurationSettings.AppSettings("connectionString");

Помните, что файлы web.config не могут быть переданы через ваш сервер в браузер, поэтому это обеспечивает некоторую безопасность, но ценная информация хранится в виде простого текста на вашем сервере, поэтому может быть целесообразно заранее зашифровать некоторые конфиденциальные строки!