为什么内存数据在我的MVC原型中的多个浏览器会话中保持不变?

时间:2009-10-30 16:13:53

标签: c# asp.net asp.net-mvc

我有一个基本的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的开发服务器中运行并假设我只是访问同一个会话。为了证明这个假设,我将会话ID添加到详细信息页面,期望看到相同的会话ID,但我错了。每个会话都有不同的ID。

除此之外 - 会话ID随着两个浏览器中的每次页面刷新而变化,并且它们总是彼此不同。

我不明白为什么会这样,并且想知道是否有人可以解释:

  • 为什么来自我的DAL模拟的数据在两个浏览器中都存在时会持续存在?
  • 为什么在页面刷新期间不会维护会话ID?

提前致谢

3 个答案:

答案 0 :(得分: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会话。因此,在重新启动Web服务器进程之前,所有会话都将看到数据(在您的情况下是VS开发Web服务器进程)。

答案 1 :(得分:2)

您使用的是静态物体吗?如果是这样,它们将在运行时的每个实例之间共享。

答案 2 :(得分:0)

也许你可以分享你的“DAL模拟”的实现?一个不能确定,但​​似乎有点像你的模拟有点瑕疵,你先检查一下吗?