2013-01-16 79 views
0

我有一個需求,我需要在我的MVC 4網站的用戶會話開始時創建數據庫記錄。創建MVC會話的唯一記錄

的入口點控制器的輪廓看起來是這樣的:

public ActionResult Index(int userId, int requestId) { 
    var userInfo = db.GetUserInfo(userId, requestId); 

    if (userInfo == null) { 
     userInfo = db.CreateUserInfo(userId, requestId); 
    } 

    // rest of code 
} 

我所發現的是,這個代碼是不是在儘可能多的很ocassionaly重複記錄創建(通常具有相同的完全可靠創建日期 - 至少到最近的毫秒)。我只能假設(外部)網頁/客戶端生成兩個幾乎同時發出的請求。

請注意,如果用戶在日後返回站點(使用相同的查詢字符串參數),那麼我希望他們拿起現有的userInfo記錄。

我知道我可以通過在表中添加一個唯一索引來解決問題,我可能需要做任何事情,但是我想知道是否有更好的模式可以遵循?

+1

這種類型的代碼更適合將它添加到'Session_start'事件中的'Global.asax'文件中。通過這種方式,您可以捕獲在最初入口點以外的其他地方進入的用戶。 –

+0

背後的意圖是什麼!在if條件下? – tigeronk2

+1

if(!userInfo == null)用於檢查記錄是否已經存在。如果userInfo爲空,則需要新記錄。 – Neilski

回答

2

當用戶會話註冊並將其存儲在數據庫的userInfo表中時,爲該用戶會話生成一個隨機字符串。當用戶稍後訪問該網站時,您只需檢查用戶名和密碼以進行身份​​驗證,如果成功,那麼您將從該數據庫中爲該用戶獲取之前存儲的唯一隨機字符串,並將其放入會話。這樣,您可以在整個生命週期中關閉用戶使用相同的隨機字符串。希望這有助於

+0

問題在於它是描述記錄唯一性的查詢字符串參數的組合。用戶有可能會在以後返回該網站。在這種情況下,我需要他們能夠拿起現有的userInfo記錄。 – Neilski

+0

@Neilski更新了我的答案...... –

+0

謝謝Bhushan。雖然這不可能,但我認爲,因爲我接受了兩個初始請求,是不是也有可能會創建兩個會話? – Neilski