Статьи

Оптимизация производительности ASP.NET с помощью кэширования состояния просмотра

Вступление

ASP.NET View State — это очень мощная функция ASP.NET, которая предоставляет механизм управления состоянием на стороне клиента. Это помогает сохранить страницу и контролировать значения между полными запросами клиента. Это дает возможность полного программирования состояния по протоколу без сохранения состояния, такому как HTTP.

ASP.NET View State хранится в скрытом поле на странице в виде закодированной строки Base64 как часть каждого ответа, отправляемого клиенту, а также возвращается на сервер клиентом как часть обратной отправки.

<input id="__VIEWSTATE" type="hidden"

name="__VIEWSTATE"
value="/wEPDwUJNzg0MDMxMDA1D2QWAmYPZBYCZg9kFgQCAQ9kFgICBQ9kFgJmD2QWAgIBDxYCHhNQ
cm2aW91c0NvbnRyb2xNb2RlCymIAU1pY3Jvc29mdC5TaGFyZVBvaW50LldlYkNvbnRyb2xzLlNQQ29u
dHJbE1vZGUsIE1pY3Jvc29mdC5TaGFyZVBvaW50LCBWZXJzaW9uPTEyLjAuMC4wLCBDdWx0dXJlPW5l
dXRyWwsIFB1YmxpY0tleVRva2VuPTcxZTliY2UxMTFlOTQyOWMBZAIDD2QWDgIBD2QWBgUmZ19lMzI3
YTQwMF83ZDA1XzRlMjJfODM3Y19kOWQ1ZTc2YmY1M2IPD2RkZAUmZ18yNDQ3NmI4YV8xY2FlXzRmYTV
fOTkxNl8xYjIyZGYwNmMzZTQPZBYCZg8PZBYCHgVjbGFzcwUbbXMtc2J0YWJsZWFsdCBtcy1zYnRhYm
xFlOTQyOWMBZAIDD2YjIyZGYjIyZGYjIyZGlYkNvbnRyb2xzLlNQQ29YkNvbnRyb2xzLlNQQ2UxMTFl
OTQyOWMBZAIDD2QWDgIBD2QWBgUmZ19lMzI3YTQwMF83ZDA1XzRlMjJfODM3Y19kOWQ1ZTc2YmY1M2IPD...==" />

Проблемы с ASP.NET View State

ASP.NET View State имеет несколько проблем, которые вам необходимо понять и решить. Как только вы решите эти проблемы, вы сможете без проблем использовать ASP.NET View State. Они обсуждаются ниже.

1. ASP.NET View State часто бывает тяжелым

Во-первых, во многих ситуациях ASP.NET View State становится очень большим, особенно когда ваше приложение ASP.NET имеет много богатых и тяжелых элементов управления и виджетов на своих страницах. Это приводит к тому, что между вашим браузером и веб-сервером перемещается много данных.

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

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

2. ASP.NET View State представляет собой угрозу безопасности

ASP.NET View State также может представлять угрозу безопасности при отправке конфиденциальных данных как части состояния просмотра клиенту. Эти данные уязвимы для атак и могут быть взломаны злоумышленником, что представляет собой серьезную угрозу безопасности. Вы можете зашифровать данные ASP.NET View State, но это опять-таки приведет к снижению производительности.

Решение ASP.NET View State Проблемы

Одним из способов решения проблем ASP.NET View State является сохранение фактического состояния ASP.NET View на веб-сервере и отправка уникального токена (или идентификатора) вместо него в браузер, чтобы браузер мог отправить этот токен обратно веб-сервер в следующий раз. Затем веб-сервер использует этот токен, чтобы найти правильное состояние просмотра ASP.NET в своем хранилище.

Вы можете сделать это, потому что строка, закодированная в ASP.NET View State, никогда не используется браузером и всегда возвращается на веб-сервер. Таким образом, будь то закодированная строка или токен одинаковы для браузера. Ниже приведен пример использования токена вместо ASP.NET View State.

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" 
	value="vs:cf8c8d3927ad4c1a84da7f891bb89185" />

Но если ваше приложение ASP.NET работает в веб-ферме с балансировкой нагрузки, следующий HTTP-запрос может прийти на другой веб-сервер. Поэтому вы должны хранить состояние просмотра ASP.NET в общем хранилище, которое доступно со всех веб-серверов.

Лучшее место для хранения ASP.NET View State на сервере — это распределенный кеш. Таким образом, вы можете не только иметь общее хранилище для всех веб-серверов, но также иметь чрезвычайно быстрое и масштабируемое хранилище в памяти по сравнению с базой данных SQL Server или другими вариантами хранения.

NCache — чрезвычайно быстрый и масштабируемый распределенный кеш для .NET. Это также позволяет хранить ASP.NET View State для решения проблем, описанных выше.

Как использовать NCache для ASP.NET View State Caching?

NCache позволяет кэшировать состояние просмотра ASP.NET без каких-либо изменений кода в приложении ASP.NET. Вам необходимо выполнить шаги, указанные ниже, чтобы настроить NCache для кэширования вашего ASP.NET View State.

Шаг 1:  Создайте файл app.browser в каталоге App_browsers. Вставьте адаптеры страниц в файл app.browser следующим образом:

File: App_browsers\app.browser

<browser refID="Default">
   <controlAdapters>
      <adapter controlType="System.Web.UI.Page"
               adapterType="Alachisoft.NCache.Adapters.PageAdapter" />
   </controlAdapters>
</browser>

Шаг 2:  Добавьте следующую ссылку на сборку в разделе компиляции файла web.config:

File: web.config

<compilation defaultLanguage="c#" debug="true" targetFramework="4.0">
	<assemblies>
		<add assembly="Alachisoft.NCache.Adapters, Version=1.0.0.0, 
			Culture=neutral, PublicKeyToken=CFF5926ED6A53769"/>
	</assemblies>
</compilation>

Шаг 3:  Зарегистрируйте раздел конфигурации NCache в вашем файле web.config.

File: web.config

<configSections>
	<sectionGroup name="ncContentOptimization">
		<section name="settings"
			type="Alachisoft.NCache.ContentOptimization.Configurations.ContentSettings"
			allowLocation="true" allowDefinition="Everywhere"/>
	</sectionGroup>
</configSections>

Шаг 4:  Укажите настройки для вашего раздела конфигурации в файле web.config (который был зарегистрирован выше). Эти параметры управляют функциями кэширования состояния NCache ASP.NET View State.

File: web.config

<ncContentOptimization>
	<settings viewstateThreshold="12" enableViewstateCaching="true" enableTrace="false" groupedViewStateWithSessions="false">
		<cacheSettings cacheName="myCache" maxViewStatesPerSession="3">
			<expirationtype="Absolute" duration="1" />
		</cacheSettings>
	</settings>
</ncContentOptimization>

Шаг 5:  В конце зарегистрируйте обработчик HTTP в разделе HttpHandlers файла web.config следующим образом:

File: web.config

<httphandlers>
	<add verb="GET,HEAD" path="NCResource.axd" validate="false"
		type="Alachisoft.NCache.Adapters.ContentOptimization.ResourceHandler, 
		Alachisoft.NCache.Adapters, Version=1.0.0.0, Culture=neutral, 
		PublicKeyToken=cff5926ed6a53769"/>
</httphandlers>

Преимущества кэширования ASP.NET View State на сервере

Вы получаете следующие преимущества, кэшируя свое состояние просмотра ASP.NET в NCache.

  1. Повышение производительности ASP.NET:  теперь в браузер отправляется небольшой токен вместо сотен килобайт данных состояния просмотра. Это уменьшает размер полезной нагрузки и повышает производительность.
  2. Снижение стоимости полосы пропускания.  Меньшая полезная нагрузка также означает значительное снижение затрат на использование полосы пропускания. Это может сэкономить вам много денег.
  3. Безопасность:  теперь, когда строка, закодированная в ASP.NET View State, не отправляется в браузер, больше нет угроз безопасности.
  4. Быстрое и масштабируемое хранилище состояний ASP.NET View State:  NCache — чрезвычайно быстрый и масштабируемый распределенный кэш. Это означает, что ваш ASP.NET никогда не сталкивается с узкими местами масштабируемости из-за хранилища ASP.NET View State.
  5. ASP.NET View State Надежность через репликацию:  NCache интеллектуально реплицирует все данные в распределенном кэше. Это означает, что вы не потеряете состояние просмотра ASP.NET, даже если сервер кеша выйдет из строя.

Расширенные возможности кэширования состояния представления ASP.NET в NCache

NCache предоставляет вам широкий набор функций для кэширования и управления состоянием просмотра ASP.NET. Ниже приведен их список.

  1. Порог минимального размера:  NCache позволяет вам указать минимальный размер ASP.NET View State. Любое состояние просмотра меньше этого не кэшируется. Это позволяет вам кэшировать только тяжелые состояния просмотра.
  2. Свяжите состояние просмотра ASP.NET с состоянием сеанса:  вы можете связать состояние просмотра ASP.NET с вашим состоянием сеанса. Таким образом, когда пользовательский сеанс истекает, все его состояния просмотра автоматически удаляются из кэша.
  3. Порог максимального числа уровней страницы:  вы можете настроить, сколько состояний просмотра должно храниться для данной страницы в режиме FIFO. Таким образом, самое старое состояние просмотра удаляется всякий раз, когда для этой страницы создается новое состояние просмотра. Это оптимизирует потребление памяти на сервере кеша, не кэшируя состояния просмотра, которые вам никогда не понадобятся.
  4. Порог максимального числа уровней сеанса:  Подобно уровню страницы, вы можете указать максимальное количество состояний просмотра для сеанса пользователя в режиме FIFO. Таким образом, самое старое состояние просмотра удаляется при каждом создании нового состояния просмотра.
  5. Настройки уровня страницы и уровня сеанса:  Вы можете указать все вышеперечисленные настройки по-разному для каждой страницы или оставить их общими для всех сеансов.
  6. Вывод

    Как вы уже видели, кэширование ASP.NET View State на сервере дает вам множество преимуществ и значительно повышает производительность ASP.NET. Это также экономит много денег в расходах на пропускную способность. И, помимо всего этого, он помогает решить некоторые проблемы безопасности, связанные с перемещением состояния просмотра ASP.NET с веб-сервера в браузер.

    Я рекомендую вам взглянуть на ваше приложение, и если ваше приложение содержит ASP.NET View State, попробуйте кэшировать его на стороне сервера. И посмотрите на NCache для этой цели. Вы можете узнать больше о NCache на  http://www.alachisoft.com