2010-05-19 9 views
0

asp.net MVC2에서 이상한 동작이 나타납니다. (적어도 기대하지는 않습니다). 나는 신용 카드를 처리하는 컨트롤러 httppost 액션을 가지고있다. 나는 사용자가 카드를 처리하려고 시도했는지 알려주는 서버에 세션 변수를 설정하고있다. 완료되면 세션 변수를 지 웁니다. 프로세스를 테스트하기 위해 몇 가지 매우 빠른 게시물을 작성 중이며 프로세스가 끝날 때 세션 변수를 지우므로 세션 변수가 매번 null로 돌아오고 있습니다. 모든 요청이 동 기적으로 처리된다는 것을 보여주는 일부 디버그 인쇄물이 있습니다. 즉 ... 첫 번째 시도가 발생하고 실패하며 세션 변수가 지워지고 두 번째 시도가 실패로 끝나고 변수가 지워집니다. 첫 번째 생각은 이것이 디버깅의 부작용이었고 로컬 웹 서버를 사용하여 디버깅을 요청합니다. 그래서 개발 서버에 넣었고 같은 일이 일어나고 있습니다. 여러 제출/게시물은 동 기적으로 처리됩니다. 나는 심지어 System.Threading.Sleep을 넣어서 세션 변수를 설정 한 직후에 멈추게 할 것이고 여전히 첫 번째 작업이 완료 될 때까지 두 번째 요청을 시작하지 않을 것이다.asp.net mvc 2 multithread

이 동작을 본 사람이 있습니까? 내 이해는 각 요청에 대해 작업자 프로세스가 생성되었으며 이러한 작업이 비동기 적으로 발생할 수 있다는 것입니다.

여기 내 코드는 항상 테스트 목적으로 신용 카드 확인에 실패 언급해야 일부 사이비 코드를

if (Session["CardCharged"] != null) 
    return RedirectToAction("Index", "Problem"); 
Session["CardCharged"] = false; //starting the process 
System.Threading.Thread.Sleep(10000); 
//charge card here 

if (!providerResponse.IsApproved) 
{ 
    System.Diagnostics.Debug.WriteLine("failed"); 
    Session["CardCharged"] = null; //have to allow them to charge again since this failed 
    return View(myModel); 
} 

Session["CardCharged"] = true; 
return RedirectToAction("Index", "OrderComplete"); 

을합니다. 처리가 여전히 발생하고 사용자를 다른 곳으로 리디렉션하는 상황을 테스트하려고합니다. 세션 ID "stick"을 보장하기 위해 다른 곳에서 더미 세션 변수를 설정했습니다. 그래서 각 요청마다 세션 ID가 동일하다는 것을 알고 있습니다.

감사

+0

테스트 요청을 어떻게 생성합니까? 그것들이 동기식으로 만들어 질 수 있습니까? – joelt

+0

신속하게 페이지 제출 또는 새로 고침을 클릭합니다. 변수를 설정 한 후에는 스레드 slero가 있으므로 중요하지 않아야합니다. 다음 요청이 수표와 리디렉션을 담당해야합니다. 그러나 요청은 다른 사람이 할 때까지 시작되지 않습니다. –

+0

세션 별 단일 요청 요청 일 수 있습니다. 적어도 고전적인 ASP에는 한계가 있습니다. – svinto

답변

0

이 브라우저가 한 번에 하나 개의 POST 요청을 전송하고 다른 요청을 대기와 제한 사항입니다. 웹 서버의 제한 사항이 아닙니다.

여러 요청을 시뮬레이트하는 한 가지 방법은 IIS 6.0 툴킷의 일부인 tinyget과 같은 도구를 사용하는 것입니다. 테스트를 위해 다중 스레드 옵션을 사용해야합니다.

희망이 도움이됩니다.

+0

그건 의미가 있지만 ... 나는 또한 두 개의 다른 브라우저 인스턴스에서 전송을 시도했다. 아마도 두 개의 다른 세션 ID라고 말할 수 있습니다.하지만 그렇지 않습니다. 확인하고 세션 ID가 동일합니다. 나는 아직도 내가하고있는 행동을 받았다. 나는 tinyget을 시도 할 것이다. –