2009-10-30 2 views
2

MVC 응용 프로그램 템플릿에서 생성 된 기본 MVC 응용 프로그램이 있습니다. 나는 일반적인 Index, Details, Edit 및 Create 메소드를 포함하는 기본 컨트롤러를 만들었습니다. 저는 Person이라는 객체를 두 개 가지고 있습니다 :MVC 프로토 타입의 여러 브라우저 세션에서 메모리 데이터가 지속되는 이유는 무엇입니까?

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가 페이지 새로 고침을 통해 유지 관리되지 않는 이유는 무엇입니까? 사전에

감사

답변

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

고맙습니다 - 그게 세션 리프레시에서 유지되지 않는 세션 ID는 무엇입니까? – BobTheBuilder

+0

이것은 IIS에서 동일합니까? 아니면 Visual Studio Development Server에 고유 한 무언가입니까? – BobTheBuilder

0

어쩌면 당신은 당신의 "DAL 모의"의 구현을 공유 할 수 있을까? 1 개는 확실하지 않다, 그러나 당신의 모의가 조금 결함이있는 것처럼 보인다, 당신은 저것을 첫째로 검사 했는가?

+0

죄송합니다 - 코드 블록을 추가하는 중이었습니다 ... 완료되었습니다. 모의는 매우 기본적이고 전혀 지속되지 않습니다. – BobTheBuilder

+0

한 가지에 대해 배우고 자한다면, 왜 다른, 관련없는 쓰레기와 함께 물을 진흙 투성이로 만드십시오. –

+0

풍자는 이전 코멘트에서 의도하지 않았습니다. –

2

정적 개체를 사용하고 있습니까? 그렇다면 실행 시간의 각 인스턴스에서 공유됩니다.

+0

신경 쓰지 마세요. 업데이트가 보입니다. 내가 예상했던 오류가 아닙니다. –

+0

감사합니다. 실제로이 문제 중 하나를 설명합니다. 그래도 나는 다른 사람들과 무슨 일이 벌어지고 있는지 잘 모르겠다. – BobTheBuilder

관련 문제