Жизненный цикл приложения ASP .NET + время жизни одиночного экземпляра

Пожалуйста, рассмотрите следующий сценарий:

  1. Я создал полнофункциональное веб-приложение, используя платформу ASP .NET MVC 3. Теперь мое приложение управляется веб-сервером.
  2. На стороне сервера моего приложения получен HTTP-запрос.
  3. На стороне сервера создается класс, реализующий шаблон проектирования singleton.
  4. В браузер отправляется ответ.
  5. Другой HTTP-запрос получен на стороне сервера моего приложения. Доступен ли одноэлементный экземпляр, использованный на шаге 2, на стороне сервера?

Я прочитал некоторую информацию о жизненном цикле приложения ASP .NET на этой странице: http://msdn.microsoft.com/en-us/library/ms178473.aspx

Но я все еще не могу ответить на свой вопрос.

Заранее спасибо за вашу помощь в будущем


Я только что сделал несколько тестов под VS2010.

Вот список основных компонентов моего проекта:

  • Контроллер Home, содержащий метод действия Index HttpGet.
  • Представление, полученное в результате метода действия Index.
  • Класс SingletonTest, реализующий шаблон проектирования singleton.

Вот код класса SingletonTest:

public class SingletonTest
{
    private int counter;
    private static SingletonTest instance = null;

    public int Counter
    {
        get
        {
            return counter;
        }
    }

    public static SingletonTest Instance 
    {
        get 
        {
            if (instance == null)
                instance = new SingletonTest();

            return instance;
        }
    }

    private SingletonTest() 
    {
        counter = 0;
    }

    public void IncrementCounter()
    {
        counter++;
    }
}

Вот код метода действия Index:

public ActionResult Index()
{
    SingletonTest st = SingletonTest.Instance;
    st.IncrementCounter();

    return View();
}

Вот код представления:

@SingletonTest.Instance.Counter

Вот тестовый сценарий, которого я придерживался:

  1. Сервер IIS был автоматически запущен VS2010.
  2. Я запросил URL-адрес / Home / Index /, тогда было отображено значение 1.
  3. Я запросил URL-адрес / Home / Index /, тогда было отображено значение 2.
  4. ...

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

Затем я остановил сервер IIS и снова выполнил свой тестовый сценарий. Получил те же результаты, что и раньше: 1, 2, ....


person user1139666    schedule 11.01.2012    source источник
comment
Попробуй это. Создайте синглтон, который внутренне увеличивается и возвращает значение при каждом вызове. Если вы продолжаете получать одно и то же значение, оно не сохраняется между запросами.   -  person Oded    schedule 11.01.2012


Ответы (2)


Несмотря на то, что синглтон может сохраняться в нескольких запросах, вам нужно быть осторожным именно по причинам вашего второго теста - при перезапуске IIS или повторном использовании пула приложений все будет потеряно.

Вы уверены, что вам нужен одноэлементный экземпляр?

Если вы хотите сохранить какое-то состояние во всех запросах, было бы лучше использовать внешнее хранилище, такое как база данных.

person Lester    schedule 11.01.2012

Как насчет нескольких экземпляров одного и того же приложения, которое IIS создаст для обработки параллельных запросов?

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

person Mohammad HS Farvashani    schedule 05.02.2013