2013-04-30 4 views
0

в веб-приложении asp.net, если я хочу сохранить переменную в статическом объекте, так? Я не хочу, чтобы этот объект поделился своим значением с другим запросом.статическая переменная ASP.NET

public static object Objects 
{ 
    get 
    { 
     if (HttpContext.Current.Items["Objects"] != null) 
      return (object)HttpContext.Current.Items["Objects"]; 
     else 
     { 
      HttpContext.Current.Items["Objects"] = new object(); 
      return new object(); 
     } 
    } 

    set { HttpContext.Current.Items["Objects"] = value; } 
} 

THX

+0

Возможно, вы можете сохранить его в переменной сеанса вместо этого? – pollirrata

+0

Это очень запутанный вопрос. «Объекты» - это не переменная, это свойство. HttpContext.Current.Items не является статическим, он является локальным для запроса. –

+0

Если вы хотите использовать статическую переменную без совместного использования ее по всем запросам, вы можете сохранить переменную сеанса в статическом свойстве. Используйте «HttpContext.Session» для доступа к нему. –

ответ

3

Статические поля являются общими для всего AppDomain. Это означает, что ВСЕ запросы в веб-приложении ASP.NET будут использовать одно и то же значение, и вам нужно будет убедиться, что переменная является потокобезопасной. Если это не то, что вы хотите, рассмотреть следующие вопросы:

  • Сохранение значения в сеансе пользователя: HttpContext.Current.Session
  • Сохранение значения в запросе: HttpContext.Current.Items. Таким образом, значение кэшируется по всему текущему запросу, но не распределяется между запросами.
  • Не храните значение вообще.

В вашем случае, однако, вы используете static. Это статическое свойство отображает в вашем случае HttpContext.Current.Items, что означает, что каждый запрос автоматически получает свою собственную переменную, а переменные не используются.

Другими словами, ваш код является потокобезопасным.

1

Я не хочу, чтобы этот объект будет делить его значение с другим запроса.

Вы не должны ставить его тогда.

+0

Это заставило меня усмехнуться. – Yatrix

+1

Это должно быть хорошо, поскольку возвращаемый объект хранится в 'HttpContext'. –

+0

Adil, вы не смотрели на код, поэтому свойство, не статичное, не имеет никакого значения, и поэтому ваш ответ вводит в заблуждение. – Steven

1

Если вы хотите использовать статическую переменную без обмена ею по всем запросам, вы можете сохранить переменную сеанса в статическом свойстве. Используйте для доступа к нему HttpContext.Session.

public static object Objects 
{ 
    get 
    { 
     if (HttpContext.Current.Session["Objects"] != null) 
      return (object)HttpContext.Current.Session["Objects"]; 
     else 
     { 
      var obj = new object(); 
      HttpContext.Current.Session["Objects"] = obj; 
      return obj; 
     } 
    } 

    set { HttpContext.Current.Session["Objects"] = value; } 
} 

Однако, вы не должны возвращать object но правильный тип, что повысит читаемость, предотвращает исключения и всегда избегает литья, где вы его использовать.

-2

, если вы хотите использовать статическую информацию по одному запросу. То есть, у одного запроса есть доступ к одному и тому же значению. Вместо этого используйте переменную сеанса.

Session['variable'] = value 

это сохранит значение в текущем сеансе, таким образом, у вас будет другое значение для каждого запроса.

0

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

Смежные вопросы