2011-02-05 47 views
1

我知道如何在您的網站中實現購物車有100萬個問題。但是,我認爲我的問題可能有所不同。我目前有一個工作購物車,我在1.1天內使用ASP.NET會話變量來回寫所有內容。這已經實施了大約6年,並且很好地滿足了它的目的。然而,現在是時候升級網站了,我負責的部分工作就是創建一個更加友好的用戶友好的網站。其中一部分是刪除updatepanel並實施真正的AJAX解決方案。使用AJAX的會話變量的簡單購物車

我的問題來了,我需要堅持這個購物車超過幾頁。當然我可以使用cookies,但我希望跟蹤購物車的統計目的(放棄統計數據,添加但未購買的物品,這些類型的統計數據)以及用戶友好性,如堅持購物車,以便如果他們回來它被記住。這很容易,如果用戶登錄,但我不想強制用戶創建一個帳戶,如果他們不想。

此外,我們處理訂單的方式有點呃,一起打耳光。所有的細節(選擇的顏色,選擇的類型等)都通過它們的描述字符串傳遞給貝寶,這些描述字符串大部分是可以的,但是如果產品對字符串的選擇太長(我相信255個字符),他們被切斷,我們不得不打電話給客戶確認他們買了什麼。如果我要實施一個更「堅實」的購物車,我們不必這樣做,因爲除了自動輸入訂單處理系統的訂單之外,所有客戶的選擇都將被存儲(它們被手動輸入一個Excel電子表格,我知道,對)。

我想以正確的方式做到這一點,但我不希望使用任何誇大其名的軟件,這些軟件不會真正適用於我們當前的業務模式。我是否使用cookie來「標記」每個訪問者,使其與他們的購物車(使用GUID給他們一個Cookie)匹配,保留他們的整個購物車客戶端,保持購物車服務器端,並從每個數據庫中拉出頁面刷新?任何幫助將不勝感激。

謝謝!

回答

3

所以這不是真的是你的問題的答案,但它是答案的一部分。我試圖找到這是重複的(它可能不是),但是如果你使用IRequiresSessionState,你可以保留很多相同的代碼。我沒有找到任何確切的重複,但我認識到這個問題。

Handler with IRequiresSessionState does not extend session timeout

其他答案:

ASP.NET: How to access Session from handler?

Authentication in ASP.NET HttpHandler

所以,你要什麼,真的只是看實現網頁PageMethods,然後你就可以減少很多與頁面進行通信的開銷。但是如果你想從你現在正在做的事情中遷移出來,你想開始實現處理程序(並將它們配置爲使用JSON--這裏有一個裝飾器),你可以使用jQuery.ajax()作爲直接URL並保留它在你的項目的相同範圍內。請注意,它會默認爲您發送cookie,所以這沒什麼大不了的。我之所以這麼說,是因爲cookie有來自Forms的標識符來讓會話被識別。

因此,如果您使用的是IRequireSessionState,那麼您仍然可以使用您以前使用的所有會話狀態信息。將Session與AJAX結合使用沒有任何問題。兩人真的沒有太大的關係。一個用於服務器存儲,另一個用於服務器通信。

現在,如果您嘗試使用完全客戶端應用程序和RESTful服務器解決方案,那麼您將需要開始傳遞複雜的JSON結構(不是什麼大問題,只需確保你可以在自己的文檔中爲自己定義自己的數據類型),並且可以將所有內容都限制爲只傳遞給它的內容。

我實際上在同一臺服務器上的應用程序中使用了這三種類型的這些方法,具體取決於我試圖對每個應用程序執行的操作。我發現每個人都有自己的優點和缺點。 (好吧,我不使用會話部分,因爲我以其他方式處理狀態,但我可以使用會話狀態)

我可以在這裏澄清什麼?

+0

有意思,所以理論上我可以在後端建立購物車,每次只填充購物車,因爲它是在session狀態保存的?有點像靜態變量? – Jason 2011-02-05 01:10:23

+0

@Jason Yep。這就是主意,所以你可以重新使用已有的大部分邏輯,我所有的關於不是完全摧毀原始的如果你不需要,並支持六年的存在很重要,這至少也可以讓你開始開發處理程序,並獲得越來越多的處理程序/ JavaScript的依賴,而不會放棄你已有的東西 – jcolebrand 2011-02-05 01:13:48

2

有幾種方法可以處理這個問題。主要問題是您需要多久才能堅持購物車信息(30分鐘,1小時,1天,1周等)。

淡儲需求最簡單的實現(30分鐘 - 1小時)

您可以通過使用HttpContext.Current.Session["key"]這樣你就可以保持你的會話存儲一樣,它目前適用於您使用頁面方法會話。你可以很容易地使用jquery ajax來調用這些頁面方法,並且不需要更新面板,腳本管理等等。所以在我看來,它會讓你一半。您的頁面加載速度更快,響應速度更快,您無需丟棄與會話中緩存內容有關的任何代碼。這方面的主要缺點是你仍然在使用會話,所以你真的不想讓會話持續太久,因爲如果會話很活躍,就會讓託管站點的服務器停滯不前。上述

長期儲存要求服務器端執行

同樣的東西適用,但您不使用會話,如果你喜歡,你可以使用無狀態的Web服務。您將爲每個訪問者生成一個GUID並將該GUID存儲在一個cookie中。在每個ajax調用中,您都會將此GUID與數據一起發送以保持。此信息將存儲在由GUID標識的數據庫中。如果客戶完成他們的訂單,那麼信息可以從緩存數據庫移動到完成的訂單數據庫。在此實現你想要寫一些服務或計劃任務,將在一定時間後刪除緩存的訂單(未完成),以保持高速緩存數據庫瘦。

這個解決方案很高興的事情是,你可以有一個相當長住緩存,寫一些報告指出鍵關閉該緩存數據,以及您的Web服務器上的負載會減少。此外,如果您的網站變得更受歡迎,則可以輕鬆擴展,因爲您不必擔心跨多個Web服務器保持會話同步。

長期存儲需求的客戶端實現

這種方法仍然使用Web服務或網頁的方法,但不涉及緩存數據庫。基本上,你將所有的信息都塞進一個cookie或一組cookie中,並將其關閉。您可能仍然能夠如果你讀出每個POST餅乾(S)的內容,並保存在某個地方報告過的獲得一些信息。

如果你不需要來跟蹤客戶添加的東西,但當時並未下令該方案的主要優點是,你可以減少你被很多做下來了POST的量。您可以使用javascript寫入cookie,並在完成訂單時發佈所有內容。只要注意不要將任何敏感信息放入未加密的cookie中(聯繫信息,帳單信息,..等等),因爲有些方法可以在某些安全性較低的瀏覽器中從其他域中的Cookie中挖掘數據。對於敏感的東西,您可以將其發送到服務器,並讓它返回加密的信息以存儲在cookie中。

該解決方案的不足之處在於,如果您需要存儲的信息很大,則可能會針對每個域限制的最大Cookie大小和/或最大Cookie數量運行。有一個好的策略(即存儲產品ID不是產品說明),你可能會確定。

如果上述任何內容不清楚或者您還有其他問題,請告知我們。

編輯:沒有看到上面的答案,本質上奠定了短存儲要求之一我有。如果這是可接受的解決方案,那麼給他一個勾號(他把我打敗了(=)。留下我的答案,因爲它列出了一些額外的選項