2010-05-19 104 views
0

我得到在asp.net MVC2一些怪異的行爲(至少這不是什麼我期待)。我有一個處理信用卡的控制器httppost操作。我正在服務器上設置一個會話變量,讓我知道用戶是否試圖處理一張卡片。我完成後清除會話變量。我做了一些非常快速的職位,以測試過程,因爲我在過程結束時清除會話變量會話變量回來空每次。我有一些調試打印,告訴我所有請求都是同步處理的。這是...第一次嘗試時,它失敗了,會話變量被清除,第二次嘗試和失敗,該變量被清除,等...我首先想到的是,這是調試的副作用,它只是內襯請求使用本地Web服務器進行調試。所以我把它放在開發服務器上,同樣的事情正在發生。多個提交/帖子是同步處理的。我甚至把System.Threading.Sleep在那裏,以確保它會停下來之後我設置會話變量,它仍然直到第一個做甚至不會開始第二次請求。asp.net mvc的多線程2

是否有其他人看到過這種行爲?我的理解是,每個請求都會產生一個工作進程,並且這些操作可能會異步發生。

下面是一些僞代碼

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「粘」。所以我知道每個請求的會話ID是相同的。

由於

+0

你是如何生成測試要求?它們可能是同步製作的嗎? – joelt 2010-05-19 19:22:26

+0

我正在迅速點擊提交或刷新頁面。由於在設置變量後有一個線程slero,它應該沒關係。下一個請求應該檢查並重定向。但是這個請求甚至在另一個做完之後纔開始。 – 2010-05-19 19:52:05

+0

我認爲這可能是一個單一請求會話問題。至少在傳統的ASP中有這樣的限制。 – svinto 2010-05-22 08:58:32

回答

0

這是與瀏覽器只發送一次一個POST請求和排隊的其它請求的限制。它不是Web服務器的限制。

一個以模擬多個請求的方法是使用一個工具,如tinyget這是IIS 6.0工具包的一部分。爲了您的測試,您將需要使用多線程選項。

希望這會有所幫助。

+0

這是有道理的,但是...我也嘗試從兩個不同的瀏覽器實例發送。我知道你可能想說這可能是兩個不同的會話ID,但事實並非如此。我檢查了會話ID是相同的。我仍然收到我正在談論的行爲。我會嘗試tinyget。 – 2010-05-20 17:13:38