2015-05-09 114 views
0

首先讓我說,我已經找到了解決方案,但我只找到了如何在Web Api中啓用會話的方式,這不是我正在尋找的方式。從Web服務訪問MVC會話

這是我需要的。在mvc中實現這個最好的方法是什麼?假設我有MVC商店應用程序。我也有移動應用程序,它使用web api來訪問我的應用程序。假設用戶將2件物品添加到購物車,那麼他必須離開,並決定繼續使用移動應用程序購物。他又增加了2個項目。所以他應該有4輛車。然後他回到家中,刷新了他的頁面,並顯示他的購物車中有4件物品。那麼......在web api和mvc項目之間共享購物車的最佳方法是什麼?我不想只將它存儲在數據庫中,並且一直讀寫數據庫。

第二個問題。有沒有任何選擇讓知道移動應用程序,該用戶剛剛添加到他的購物車沒有移動應用程序ping通web api這種信息的所有時間?

+1

實際上,最好爲此使用數據庫。如果您使用InProc會話,則應用程序無法縮放。如果你使用SQL Session,那麼......你在一個框架上使用了一個數據庫。更好地將用戶的會話存儲在鍵/值表中的數據庫中的json中:key是UserID(或SessionID),value是包含會話數據的json字符串。把一個索引放在關鍵字上,這樣perf就不是問題了:如果你和你的應用可以輕鬆擴展。 – frenchie

回答

0

如果您認真對待這一點,我認爲您應該將MVC應用程序視爲Web API作爲應用程序層,其主要職責是以不同格式呈現數據。在下面的業務層中,存儲購物車,用戶信息等,爲此,數據庫是一個非常好的選擇。平面文件存儲也是一種選擇,但缺乏有效的併發處理等。

另一方面,內存存儲是一個非常糟糕的想法,因爲數據將無法在重新啓動Web應用程序/ Web API。

0

從你對問題的描述我假設你將會話保存在內存中。這不是一個很好的做法,因爲在使用此功能後,您將無法將您的Web應用程序擴展到多個服務器,並且如果您這樣做,您將不得不維護粘性會話。

相反,如果你保持會話了服務器的內存,你
1.可以擴展多種服務哪個更適合您的塞納里奧之間以及
2.共享會話狀態。
3.可以很容易地更新一個設備關於用戶會話的狀態/信息。

對於問題的第二部分,您可以使用多種技術與多個設備共享此會話狀態。
1.輪詢(你可能正在做的現在)
2.長輪詢(保持與服務器的持續連接。仿長連接狀態)
3. Socket連接
4.按技術(最看好在你的情況下)

對於更完整和端到端的解決方案,你也可以看看像firebase.com這樣的網站,它給你一個解決方案,處理你在這裏提到的情況。

0

基本上有兩種方法可以做到這一點。

您不能使用會話或cookie,因爲您將擁有多個會話和多個客戶端,因此會話將不會相同,並且Cookie不會相同。

如果您只使用一臺服務器,則可以使用.net運行時緩存存儲數據,並鍵入用戶標識。但是,當應用程序池被回收時,這仍然會丟失。

最好的選擇是將數據存儲在數據庫中。我知道你說你不想要,但是你的理由(不想經常訪問數據庫)不是一個很好的理由來避免它,因爲有很多方法可以最大限度地減少數據庫訪問。

最簡單的方法是使用數據庫和緩存的組合。所以,你檢查購物車的緩存,如果它在那裏,你使用它。如果沒有,則從數據庫加載並將其放入購物車。

這解決了幾個問題,並使其對多個服務器更具可擴展性,並使其更快,因爲它只檢查一次數據庫。但是,無論何時更新購物車,您都必須寫入數據庫和緩存。

您可能仍然存在一些使用多臺服務器和多臺設備的緩存一致性問題......例如,如果您同時使用兩臺設備,它們可能位於不同的服務器上,並具有不同的緩存條目..但也有辦法解決這個問題。

至於你的第二個問題,你最好的選擇是當購物車更新時使用SignalR發送消息到你的移動應用程序。