2015-05-09 116 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发送消息到你的移动应用程序。