Ссылка в вашем вопросе говорится следующие предположения о ApplicationState
:
Волатильность: Поскольку состояние приложения хранится в памяти сервера, то теряется всякий раз, когда приложение останавливается или перезапускается.
Ресурсы: Потому что хранится в памяти, состояние приложения очень быстро по сравнению с сохранением данных на диске или в базе данных.
Масштабируемость: состояние Приложение не разделяет между несколькими серверами, обслуживающих те же приложения
провайдер, как вы предложили бы изменить волатильности (поскольку данные будут жить в другом месте и может быть восстановлен), а также обеспечить масштабируемость (потому что несколько ApplicationState
s могут затем поделиться значениями). Однако это связано с той простотой, которую предлагает эта страница для ApplicationState
.
Короче говоря, это похоже на .NET, предназначенный для этой структуры данных для хранения значений, необходимых для одного экземпляра приложения, которое не нужно было сохранять за перезагрузкой процесса. Если вы используете его в этом смысле, может быть стоит рассмотреть другую структуру данных, чем ApplicationState
, вместо того, чтобы сгибаться через обручи, чтобы сделать ее чем-то, чего не предполагалось. Даже если вы все же удалось написать персистенции слой, думать о последнем пункте они воспитывают:
- Параллелизм: состояние Применение свободно нарезкой, что означает, что государственные данные приложения могут быть доступ одновременно многими темы.
Как вы поддерживаете это, когда вводите задержку и ошибку, связанную с разговором с таблицей Azure, предположительно на другой виртуальной машине или, по крайней мере, на другом процессе? Что происходит, когда поток 1 производит изменение значения, тогда поток 2 изменяет его обратно, но изменение из потока 2 записывается на диск сначала, а затем в поток 1? После перезагрузки вы понятия не имели, какова ожидаемая стоимость.
Короче говоря, я не думаю, что вы должны это написать. Это не инструмент, который необходим, и прерывает использование (хотя этого недостаточно, чтобы сказать, что его не следует писать).Последний гвоздь в гробу состоит в том, что это невозможно, потому что Microsoft не раскрывает ту же гранулярность, что и для класса SessionStateProvider
.
Надеюсь, вы не будете зависеть от того, насколько это точно ... потому что он никогда не будет ... Есть много ситуаций, когда Session_End никогда не будет вызван, например, когда пул приложений будет переработан. –
@ErikFunkenbusch Это всего лишь один из способов, которыми я хочу использовать пользовательский поставщик приложений ASP.NET, спасибо, что заметили. –