从Web服务访问MVC会话

时间:2015-05-09 14:27:29

标签: c# asp.net asp.net-mvc asp.net-web-api

首先让我说我已经搜索了解决方案,但我发现只有如何在Web Api中启用会话的方式,这不是我正在寻找的。

这就是我需要的。什么是在mvc实现这一目标的最佳方法。让我们说我有MVC商店应用程序。我也有移动应用程序,它使用web api访问我的应用程序。让我们说用户在购物车中添加了两件商品,然后他不得不离开并决定继续使用移动应用购物。他又增加了2件物品。所以他应该有4个购物车。然后他回到家里,刷新了他的页面,并向他显示购物车中有4件物品。那么......什么是在web api和mvc项目之间共享购物车的最佳方法。我不想只将它存储在数据库中,并且一直读/写数据库。

第二个问题。是否有任何选项可以让移动应用程序知道用户刚刚在他的购物车中添加了一些东西而没有移动应用程序一直ping这个信息的web api?

3 个答案:

答案 0 :(得分:0)

如果您对此非常认真,我认为您应该将MVC应用程序视为Web API作为应用程序层,其主要职责是以不同格式显示数据。在您下面的业务层中存储购物车,用户信息等,为此目的,数据库是一个非常好的选择。平面文件存储也是一种选择,但缺乏有效的并发处理等。

另一方面,内存存储是一个非常糟糕的主意,因为重新启动Web应用程序/ Web API后数据将无法生存。

答案 1 :(得分:0)

从您对问题的描述中我假设您正在将会话保存在内存中。这不是一个很好的做法,因为在使用此功能后,您将无法将Web应用程序扩展到多个服务器,如果您这样做,则必须维护粘性会话。

相反,如果您将会话保留在服务器内存中 1.可以很好地扩展 2.在多种服务之间共享更适合您的服务的会话状态 3.可以非常轻松地更新一台设备关于用户会话的状态/信息。

对于问题的第二部分,您可以使用多种技术与多个设备共享此会话状态。
1。轮询(你现在可能正在做)
2。长轮询(保持与服务器的连续连接。模仿长连接状态)
3。套接字连接
4。推送技术(在您的情况下最喜欢的

对于更完整的端到端解决方案,您还可以寻找像firebase.com这样的网站,它们可以为您提供处理您在此处提及的案例的解决方案。

答案 2 :(得分:0)

基本上有两种方法可以做到这一点。

您不能使用会话或cookie,因为您将拥有多个会话和多个客户端,因此会话将不相同且cookie将不相同。

如果您只使用一台服务器,则可以使用.net运行时缓存来存储数据,并以用户ID为键。但是,当应用程序池被回收时,这仍然会丢失。

最好的办法是将数据存储在数据库中。我知道你说你不想,但你的理由(不想经常访问数据库)不是避免它的理由,因为有很多方法可以最大限度地减少数据库访问。

最简单的方法是使用数据库和缓存的组合。因此,您检查购物车的缓存,如果它在那里,您使用它。如果没有,则从数据库加载它并将其放入购物车。

这解决了几个问题,并使其更易于扩展到多个服务器,并使其更快,因为它只检查数据库一次。但是,每当购物车更新时,您都必须写入数据库和缓存。

您可能仍然遇到一些使用多个服务器和多个设备的缓存一致性问题...例如,如果您同时使用这两个设备,它们可能位于不同的服务器上,并且具有不同的缓存条目。但也有办法解决这个问题。

关于您的第二个问题,最好的办法是在购物车更新时使用SignalR向您的移动应用发送消息。