Статические переменные в веб-приложениях - PullRequest
10 голосов
/ 07 марта 2011

Могу ли я использовать статические переменные в своем веб-приложении? Какие есть альтернативы статическому? Когда я использую статические переменные на страницах и более одного пользователя используют приложение, оно создает конфликтные данные (неверные данные).

Каковы ограничения использования статических элементов?

Размещены ли статические члены в памяти?

Ответы [ 2 ]

18 голосов
/ 07 марта 2011

Рассмотрите возможность хранения ваших общих переменных в объекте HttpApplication или в объекте Cache.

Однако, если вы пытаетесь сохранить значения для каждого пользователя отдельно, вы должны сохранить эти значения в переменной Session.

Статические переменные внутри Asp.Net совместно используются в области памяти процесса w3svc.exe и НЕ являются поточно-ориентированными Они могут быть доступны и изменены любым пользователем приложения. Это может привести к нежелательным изменениям, если вы не напишите свой собственный механизм блокировки вокруг хранилища этих значений.

Вы должны попробовать такой синтаксис, как:

Application["KEY"] = value;

для хранения общих данных приложения и

Session["KEY"] = value;

для хранения данных для каждого пользователя

Вы можете использовать объект WebCache для хранения данных в памяти веб-сервера с условиями истечения срока действия. Синтаксис для этого выглядит примерно так:

Page.Cache.Insert("KEY", "VALUE", null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);

Подробнее о синтаксисе управления объектом WebCache можно узнать по адресу:

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx

3 голосов
/ 07 марта 2011

Просто чтобы добавить к тому, что сказал @Jeff Fritz, приложение IIS создает домен приложений, в который загружаются ваши сборки.Точно так же, как правила обычного приложения Windows, если такой класс, как

public static class Something
{
    public static string SomeString { get; set; }
}

..., тогда доступно только одно свойство Something.SomeString на AppDomain.Процесс W3SVC управляет доменом приложений, но не гарантирует безопасности потоков (так как домен приложений может обслуживать несколько запросов).Если вы используете статические свойства только для чтения, это, вероятно, хорошо (например, чтение значений конфигурации).Если вы создаете изменяемые свойства, которые изменяются в течение срока действия запроса, лучше использовать один из механизмов хранения, подробно описанных здесь.

...