2011-06-15 70 views
0

假設我有一個客戶正在填寫網站的數據。使用的基礎持久性是Nhibernate。nhibernate和asp.net的有狀態會話

現在的一系列事件是這樣的

  1. 用戶填寫了表格。
  2. 他提交表格。
  3. nhibernate sessionfactory創建並通過客戶對象將其保存到數據庫。
  4. 數據庫使用nhibernate的本地生成器提交會話對象
  5. 但是在服務器的響應到達客戶端之前發生了一個事故。與客戶端的連接關閉。
  6. 客戶端看到頁面未找到錯誤或請求超時錯誤。並有一個困境,他尚未註冊。
  7. 所以他再次按下刷新按鈕。並且相同的數據集(儘管已提交給數據庫)已發送到服務器以進行數據庫提交。
  8. 服務器看到數據並再次向不同的id註冊同一個客戶。
  9. 所以問題就像。現在相同的客戶條目已被重複兩次,導致連接中斷。

現在有人可以告訴我如何進入這種情況。因此,即使客戶提交,他只能識別一個條目並提交,即使響應已被切斷並按下了刷新按鈕?

回答

0

思考:

1)你不想在每次請求創建NHibernate的SessionFactory的。這應該創建一次,然後用於所有未來的請求。這是一項重量級的操作。只有會話需要創建每個請求。

2)以高層次方式管理交易 - 減少發生事故後發生事故的可能性,但在客戶有迴應之前。

3)通過讓submit函數返回一個顯示信息的不同頁面,防止「刷新」方法重新提交。此頁面不應該提交任何內容。

4)通過根據先前提交的憑證驗證提交來防止重新提交服務器端。通知客戶他們以前是否已經註冊並提供了訪問保存的詳細信息的手段(例如,密碼恢復)。

因此,例如,如果您的用戶通過電子郵件地址鍵入,然後在頁面加載事件中執行以下步驟:

+0

第4點可以請你給一個虛擬的例子代碼?我其實並不瞭解這個概念,但還沒有實現,我沒有使用任何MVC,只是簡單的asp.net 3.5,所以如果你可以使用一個控制器方法,如果你可以提供一個虛擬代碼。這將是一個非常有用的:(對不起,詢問優惠,但真的不知道如何實施 – Joy 2011-06-16 04:42:03

+0

不必控制器 - 編輯說高層次的方法 - 例如在Page_Load。因此,Page_Load應打開交易,檢查數據庫查看用戶是否已經註冊,如果沒有,保存新的用戶詳細信息,然後提交事務和Response.Redirect到指示註冊成功的頁面。 – BonyT 2011-06-16 08:54:52

+0

你的意思是我應該實現ihttpModule,然後使用一些有點context.beginrequest事件內部做它的工作..然後檢查會話是否已經存在..它只會更新該會話,否則它會說用戶已經存在。 ..之後,當其context.endrequest事件時,它將簡單地清除本地會話。這是你想說的方式嗎?我搜索了一下,發現這個鏈接到了你所說的情況。 http://adammatusiak.blogspot.com/2010/03/binding-fluent-nhibernate-session-to.html – Joy 2011-06-17 04:08:36