State Server disadvatages - PullRequest
       7

State Server disadvatages

1 голос
/ 19 сентября 2011

Состояние Proc Session State отсутствует в двух случаях: когда Wroker Process Recycling или когда время ожидания сеанса.

Мне нужно хранить конфиденциальные переменные сессии, где приложение зависит от его существования. Итак, я сделал две вещи.

1- Сделать тайм-аут сеанса> Тайм-аут аутентификации формы.

2 - использовать State Server. Использование State Server вызвало проблемы с производительностью, поэтому я использовал Cache для повышения производительности.

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

Что ты думаешь? Что-то мне не хватает?

Есть ли лучшая парадигма, которая больше помогает остальной части архитектуры?

Спасибо

 public class ContextManager : Manager
    {

        private static Customer m_Customer;

        public static void LoadCustomer(int customerID)
        {

            if (customerID <= 0)
            {
                throw new ArgumentException("customer id should be >= 0");
            }

            m_Customer = CustomerManager.FindCustomerByID(customerID);
            HttpContext.Current.Session["Customer"] = m_Customer;
        }



        public static Customer Customer
        {
            get
            {


                if (m_Customer == null) // for performance.  the code visit this place very frequently in one http request
                {
                        CheckCustomerInSession();
                        m_Customer = HttpContext.Current.Session["Customer"] as EdaraFramework.DOC.Customer.Customer;
                }

                return m_Customer;
            }
        }

        private static void CheckCustomerInSession()
        {
            if (HttpContext.Current.Session["Customer"] == null)
            {
                // Pages accepted to have a null customer are default page and customer Search
                // , Customer Edit is where LoadCustomer is called.
                if ((!HttpContext.Current.Request.Path.Contains("Default.aspx")) 
                    && (!HttpContext.Current.Request.Path.Contains("CustomerSearch.aspx")))
                {
                    m_Customer = null;
                    HttpContext.Current.Response.Redirect("~/Default.aspx");
                }
            }
        }
    }

Ответы [ 2 ]

1 голос
/ 19 сентября 2011

Я думаю, вы можете сделать шаг назад и по-настоящему задуматься над тем, что вы делаете.

"Использование сервера состояний вызвало проблему с производительностью ..."

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

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

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

0 голосов
/ 19 сентября 2011

Это плохая идея, вы получите неожиданное разделение состояния между различными пользователями вашего приложения и неожиданный сброс статических полей при выгрузке домена приложения. Если вам нужен сеанс, чтобы жить дольше, используйте StateServer или Sql Session.

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

Ref: http://www.velocityreviews.com/forums/t122181-static-fields-in-asp-net-pages.html

Сервер состояний находится в структуре памяти. Я был бы удивлен, если у него есть проблемы с производительностью. Sql Session записывает на диск, поэтому у него есть снижение производительности, но обычно оно недостаточно велико, чтобы это заметить. Был ли запущен State Server, произошла ли ошибка тайм-аута или время загрузки страницы неожиданно увеличилось?

Проблемы с производительностью, как правило, вызваны длительным выполнением хранимых процедур или чрезмерно большим количеством вызовов хранимых процедур на одной странице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...