Опубликован: 13.07.2010 | Уровень: специалист | Доступ: платный
Самостоятельная работа 35:

Управление состоянием страниц на клиенте

Упражнение 11. Хранение данных в состоянии приложения

Состояние приложения - это область памяти сервера, выделяемая при запуске приложения для хранения глобальных данных, доступных с любой страницы приложения. На эти данные в каждой странице ссылается объект-словарь Application типа System.Web.HttpApplicationState. Как и при состоянии сеанса, состояние приложения хранит данные в виде объектов, поэтому при их извлечении необходимо явное преобразование типов.

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

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

  • Удалите из конфигурационного файла ключ передачи идентификатора сессий в строке адреса
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
    <system.web>
        <compilation debug="true" />
        <sessionState cookieless="true" regenerateExpiredSessionId="true" />
  </system.web>
</configuration>
Листинг 35.24. Файл web.config с включенным режимом Cookieless
  • Добавьте к приложению файл Global.asax и заполните его так
<%@ Application Language="C#" %>
    
<script runat="server">
    
    void Application_Start(object sender, EventArgs e) 
    {
        this.Application["clicks"] = (int)0;
    }
</script>
Листинг 35.25. Файл Global.asax
  • Создайте страницу без отделенного кода с именем ApplicationState1.aspx, назначьте ее стартовой и заполните так
<%@ Page Language="C#" %>
    
<script runat="server">
    
    protected void Page_Load(object sender, EventArgs e)
    {
        // Читаем без проверки - инициализирована в global.asax
        int visit = (int)this.Application["clicks"] + 1;
        // Обновляем состояние приложения с блокировкой 
        this.Application.Lock();
        this.Application["clicks"] = visit;
        this.Application.UnLock();
        
        // Создаем текстовую метку
        Label label = new Label();
        form1.Controls.Add(label);
        label.Text = "Сегодня вы посетили нас в " 
            + visit.ToString() + " раз!<br />";
        
        // Создаем гиперссылку
        HyperLink link = new HyperLink();
        form1.Controls.Add(link);
        link.NavigateUrl = "~/ApplicationState2.aspx";
        link.Text = "На другую страницу...";
    }
</script>
    
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    </form>
</body>
</html>
Листинг 35.26. Файл ApplicationState1.aspx
  • Создайте копию для страницы ApplicationState1.aspx с именем ApplicationState2.aspx и поменяйте в ней гиперссылку на ApplicationState1.aspx, чтобы страницы ссылались друг на друга
  • Запустите само приложение несколько раз и пощелкайте по ссылкам чтобы убедиться, что счетчик количества визитов увеличивается


  • В панели задач нижней части экрана щелкните правой кнопкой мыши на пиктограмме тестового сервера и остановите его командой Stop


  • Вновь запустите страницу ApplicationState1.aspx, чтобы убедиться, что счетчик сбросился в начальное значение
Иван Циферблат
Иван Циферблат
Россия, Таганрог, 36, 2000