Почему в моем прототипе MVC данные в памяти сохраняются в течение нескольких сеансов браузера?

2

У меня есть базовое приложение MVC, созданное из шаблона приложения MVC. Я создал базовый контроллер, который содержит обычные методы Index, Details, Edit и Create; У меня есть несколько классов для хранения моего объекта Person:

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Description { get; set; }
}

И еще один макет фальшивого DAL. Он не сохраняет данные в файл или базу данных, это просто быстрый макет для цели этого прототипа:

public class PersonData
{
    /* Fake out our initial repository */
    static List<Person> People = new List<Person>()
    {
        new Person() { Id=1, FirstName="John", LastName="Doe", Description="King of the world" },
        new Person() { Id=2, FirstName="Jane", LastName="Doe", Description="Chief whip cracker" }
    };

    /* Set up the indexing system */
    private static int GetNextId()
    {
        return People.OrderByDescending(i => i.Id).First().Id + 1;
    }

    public static IEnumerable<Person> GetPeople()
    {
        return People;
    }

    public static Person GetPerson(int id)
    {
        if (id > People.OrderByDescending(i => i.Id).First().Id)
            throw new ArgumentOutOfRangeException();

        return People.Where(i => i.Id.Equals(id)).SingleOrDefault();
    }

    public static void Save(Person data)
    {
        /* Either remove the old one or assign a new ID */
        if (data.Id != 0)
            People.Remove(People.Where(i => i.Id.Equals(data.Id)).SingleOrDefault());
        else
            data.Id = GetNextId();

        People.Add(data);
    }
}

В контроллере нет ничего особенно интересного, здесь выдержка из функции "Редактировать":

    // GET: /Person/Edit/5
    public ActionResult Edit(int id)
    {
        Person person = PersonData.GetPerson(id);
        return View(person);
    }

    //
    // POST: /Person/Edit/5
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(Person person)
    {
        try
        {
            PersonData.Save(person);
            return RedirectToAction("Details", person);
        }
        catch
        {
            return View(person);
        }
    }

Все работает, но я заметил пару любопытных аномалий, которые я не могу объяснить. Прежде всего, если я внес изменения в человека в моей форме редактирования и сохранил его, все будет отражено на странице подробностей просто отлично. Затем я расскажу о другом экземпляре браузера - Opera/Chrome/Whatever и введите страницу сведений для этого человека. Я ожидал увидеть, что во втором браузере я увижу данные, предшествующие моим изменениям, потому что PersonData загружается только в память и не сохраняется, однако я вижу изменения, которые были сделаны в браузере 1 во втором браузере.

Я сделал это, потому что я работаю на Visual Studio Development Server и предположил, что я просто получаю доступ к тому же сеансу. Чтобы доказать гипотезу, я добавил идентификатор сеанса на страницу сведений, ожидающую увидеть тот же идентификатор сеанса, но я ошибся. Каждый сеанс имеет другой идентификатор.

Далее - идентификатор сеанса изменяется с обновлением каждой страницы в обоих браузерах, и они всегда отличаются друг от друга.

Я не понимаю, почему это так и интересно, может ли кто-нибудь объяснить:

  • Почему данные из моего DAL-макета сохраняются в обоих браузерах, когда они находятся на разных сеансах?
  • Почему идентификатор сеанса не поддерживается на странице обновления?

Заранее спасибо

Теги:
asp.net-mvc

3 ответа

6
Лучший ответ

Ваш поддельный репозиторий объявляется как статический:

/* Fake out our initial repository */
static List<Person> People = new List<Person>()
{
    new Person() { Id=1, FirstName="John", LastName="Doe", Description="King of the world" },
    new Person() { Id=2, FirstName="Jane", LastName="Doe", Description="Chief whip cracker" }
};

Статика существует для жизни процесса, она не привязана к сеансу ASP.NET. Поэтому все ваши сеансы будут видеть данные до перезапуска процесса веб-сервера (в вашем случае процесс веб-сервера разработки VS).

  • 0
    Спасибо - это объясняет, что ... как насчет идентификатора сеанса, который не поддерживается при обновлении страницы?
  • 0
    Это то же самое в IIS или это что-то уникальное для сервера разработки Visual Studio?
2

Используете ли вы статические объекты? Если это так, они распределяются между каждым экземпляром времени выполнения.

  • 0
    Неважно, я вижу ваше обновление. Не та ошибка, которую я ожидал.
  • 0
    Спасибо, это действительно объясняет одну из проблем. Я не уверен, что происходит с другим, хотя.
0

Возможно, вы могли бы поделиться реализацией своего "DAL mock"? Нельзя быть уверенным, но это похоже на ваш макет, немного испорченный, вы сначала это заметили?

  • 0
    Извините - был в процессе добавления блоков кода ... они сделаны. Насмешка очень простая - не сохраняется вообще.
  • 0
    Если вы пытаетесь узнать что-то одно, зачем мутить воду другим, не относящимся к делу барахлом.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню