Как предотвратить сброс значения сеанса файла Global.asax в asp.net?

У меня есть около 10 переменных сеанса для хранения количества загрузок файлов для каждой из 10 категорий. Я не знаю, почему? но моя переменная сеанса, установленная в Global.asax, автоматически получает RESET.

Так как Машина не перезагружается. По-прежнему сбрасывается счетчик загрузок файлов. Есть идеи? Пожалуйста, предложите мне любое решение.

В Global.asax:

 void Application_Start(object sender, EventArgs e) 
    {
        Application.Add("MGM",0);
        Application.Add("PC",0);
        Application.Add("NC",0);
        Application.Add("TC",0);
        Application.Add("PGC",0);
    }

    The *shortCode* parameter is name of Global Session from Global.asax file. that i am passing to get the counter and increment accordingly.
In Download.aspx.cs Page:

private int GetCount(string shordCode)
{
    int count=0;
    count = Convert.ToInt32(Application[shortCode]);
    lock (Application[shortCode])
    {
        Application[shortCode] = ++count;
    }

    return count;
}

Должен ли я хранить значение в текстовом файле и обновлять его после определенного количества, скажем, 500. Если да, то как это сделать? Наш коллега говорит, что если предположить, что многие пользователи загружают файл, и если оба получают доступ к одному и тому же значению из текстового файла, то может возникнуть cuncurency. Я запутался ...! Помощь приветствуется.


person SHEKHAR SHETE    schedule 11.08.2012    source источник


Ответы (3)


Посетите страницу MSDN, чтобы узнать состояние приложения ASP.NET.

Выдержка:

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

По умолчанию пул приложений ASP.NET, работающих в IIS, отключается в периоды бездействия. Я считаю, что значение по умолчанию для этого составляет 20 минут. Также по умолчанию пулы приложений перезапускаются каждые 1740 минут (29 часов).

Когда это произойдет, вы потеряете в коллекции Application[] все, что вы не сохранили в более постоянном месте, например в базе данных.

Оба вышеупомянутых значения можно изменить, щелкнув правой кнопкой мыши конкретный пул приложений в inetmgr и щелкнув Advanced Properties, чтобы открыть соответствующее окно.

person Joshua Shearer    schedule 11.08.2012
comment
Спасибо @Joshua за ответ, так что мне делать, чтобы предотвратить эту ситуацию? я должен писать в текстовый файл или sqlserver ..? - person SHEKHAR SHETE; 11.08.2012
comment
Почти каждый сайт, который я когда-либо видел, хранил вещи такого рода непосредственно в базе данных. Единственный случай, когда я бы даже подумал о кэшировании данных этого типа в состоянии приложения, был бы, если бы сайт получал большой объем трафика и сайт был ограничен базой данных. Даже тогда я сохранял бы изменения непосредственно в базе данных и просто обновлял свой кешированный результат. Насколько я понимаю, это дает вам лучшее из обоих миров. - person Joshua Shearer; 11.08.2012
comment
хорошо! Большое спасибо...! я попытаюсь сохранить в базе данных ..! - person SHEKHAR SHETE; 11.08.2012

ок, хорошо! Пожалуйста, попробуйте мое простое приложение, четыре проблемы:

       protected void Application_Start(object sender, EventArgs e)
    {
        Application.Add("MGM", 0); 
    }

    protected void Session_Start(object sender, EventArgs e)
    {
        Application.Lock();
        Application["MGM"] = System.Convert.ToInt32(Application["MGM"]) + 1; 
        Application.UnLock();
    }

    protected void Session_End(object sender, EventArgs e)
    {
        Application.Lock();
        Application["MGM"] = System.Convert.ToInt32(Application["MGM"]) - 1;
        Application.UnLock();
    }

    protected void Application_End(object sender, EventArgs e)
    {
        Application.Clear();
    }

и ваш метод я изменил:

   private int GetCount(string shordCode)
{
    return Convert.ToInt32(Application[shortCode]); 
}
person Elyor    schedule 11.08.2012
comment
спасибо за ответ @eli, но это неправильное решение моей проблемы, и я не понимаю, почему вы уменьшаете счетчик в SessionEnd(). Я увеличиваю счетчик только тогда, когда файл загружается ... не удовлетворен вашим предложением ..! - person SHEKHAR SHETE; 11.08.2012

Хорошо, отлично, я отвечаю на этот вопрос и пытаюсь изменить ваш метод:

Запустите ваше веб-приложение:

protected void Application_Start(object sender, EventArgs e) 
{
    Application.Add("MGM",0);
    Application.Add("PC",0);
    Application.Add("NC",0);
    Application.Add("TC",0);
    Application.Add("PGC",0);
}

и изменил логику метода подсчета:

 private int GetCount(string shordCode)
    {
        //current app instance
        var currentApp = HttpContext.Current.ApplicationInstance.Application;

        //get item count
        var count = Convert.ToInt32(currentApp[shordCode]);

        //locking app for your asking count insrement
        currentApp.Lock();
        currentApp[shordCode] = ++count;

        //unlock app
        currentApp.UnLock();

        return count;
    }
person Elyor    schedule 31.08.2012