2014-12-12 5 views
1

Я до сих пор реализовал несколько специализированных поставщиков с несколькими арендаторами для Azure Table Store, таких как поставщик состояния сеанса ASP.NET, поставщик виртуального пути ASP.NET, a.s.f. Теперь я хотел бы реализовать специализированного поставщика многопользовательских услуг ASP.NET Application-State, но я не нашел никаких ресурсов или лучших практик в Интернете.Поставщик состояния приложения ASP.NET

В приведенном ниже примере я покажу, как я хотел бы использовать ASP.NET Application-State поставщика, чтобы следить за количеством интернет-пользователей во всех моих Azure узлов веб-приложения:

void Session_Start(object sender, EventArgs e) 
{ 
    Application["NumOnlineUsers"] = ((int)Application["NumOnlineUsers"] + 1); 
} 

void Session_End(object sender, EventArgs e) 
{ 
    Application["NumOnlineUsers"] = ((int)Application["NumOnlineUsers"] - 1); 
} 

Как я могу внедрить поставщика приложений ASP.NET, где я сохраняю данные состояния приложения в магазине Azure Table Store?

+0

Надеюсь, вы не будете зависеть от того, насколько это точно ... потому что он никогда не будет ... Есть много ситуаций, когда Session_End никогда не будет вызван, например, когда пул приложений будет переработан. –

+0

@ErikFunkenbusch Это всего лишь один из способов, которыми я хочу использовать пользовательский поставщик приложений ASP.NET, спасибо, что заметили. –

ответ

1

Ссылка в вашем вопросе говорится следующие предположения о ApplicationState:

  • Волатильность: Поскольку состояние приложения хранится в памяти сервера, то теряется всякий раз, когда приложение останавливается или перезапускается.

  • Ресурсы: Потому что хранится в памяти, состояние приложения очень быстро по сравнению с сохранением данных на диске или в базе данных.

  • Масштабируемость: состояние Приложение не разделяет между несколькими серверами, обслуживающих те же приложения

провайдер, как вы предложили бы изменить волатильности (поскольку данные будут жить в другом месте и может быть восстановлен), а также обеспечить масштабируемость (потому что несколько ApplicationState s могут затем поделиться значениями). Однако это связано с той простотой, которую предлагает эта страница для ApplicationState.

Короче говоря, это похоже на .NET, предназначенный для этой структуры данных для хранения значений, необходимых для одного экземпляра приложения, которое не нужно было сохранять за перезагрузкой процесса. Если вы используете его в этом смысле, может быть стоит рассмотреть другую структуру данных, чем ApplicationState, вместо того, чтобы сгибаться через обручи, чтобы сделать ее чем-то, чего не предполагалось. Даже если вы все же удалось написать персистенции слой, думать о последнем пункте они воспитывают:

  • Параллелизм: состояние Применение свободно нарезкой, что означает, что государственные данные приложения могут быть доступ одновременно многими темы.

Как вы поддерживаете это, когда вводите задержку и ошибку, связанную с разговором с таблицей Azure, предположительно на другой виртуальной машине или, по крайней мере, на другом процессе? Что происходит, когда поток 1 производит изменение значения, тогда поток 2 изменяет его обратно, но изменение из потока 2 записывается на диск сначала, а затем в поток 1? После перезагрузки вы понятия не имели, какова ожидаемая стоимость.

Короче говоря, я не думаю, что вы должны это написать. Это не инструмент, который необходим, и прерывает использование (хотя этого недостаточно, чтобы сказать, что его не следует писать).Последний гвоздь в гробу состоит в том, что это невозможно, потому что Microsoft не раскрывает ту же гранулярность, что и для класса SessionStateProvider.

+0

* Ресурсы * Я могу справиться с кэшированием в памяти, я уже успешно реализовал этот шаблон с другими провайдерами. * Волатильность * может быть решена путем чтения из хранилища при запуске приложения. * Concurrency * не является для нас важным, поскольку мы можем обрабатывать некоторые ошибки - это не важные для бизнеса данные, которые мы храним. * Масштабируемость *; хорошо, что он будет распространяться, если мы получим провайдера приложений и работаем. –

+0

Я говорю, что вы исправляете вещи, которые не предназначены для исправления. Части, выделенные жирным шрифтом, обозначают ограничения, предназначенные для состояния приложения, поскольку он не должен быть надежным хранилищем данных. Если да, то какая причина для базы данных? Или сеанс? «Фиксируя» эти вещи, вы превращаете состояние приложения в поставщика, как и другие, о которых вы упомянули, но по какой причине? Состояние приложения должно быть ограничено и отличается от других поставщиков. Проще, не сложнее. – welegan

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