首页 新闻 会员 周边

mvc中怎么进行 EnableSessionState="ReadOnly"的这种设置?!!

0
悬赏园豆:10 [已解决问题] 解决于 2013-11-29 08:36

mvc中,ajax操作的时候使用到了session,然后影响到其他地方,页面就被卡住了,

怎么解决这个问题,求解。。

IT编外人员的主页 IT编外人员 | 初学一级 | 园豆:95
提问于:2013-11-28 15:28
< >
分享
最佳答案
0

您可以在说清楚点吗?是不是AJAX跳到后台ActionResult后使用SESSION。或者说这时修改它,导致另一个页面卡住?

收获园豆:10
薛凯凯圆滚滚 | 初学一级 |园豆:36 | 2013-11-28 16:45

哦,是有两个定时器发送ajax请求进行查询,session中保存了需要查询的id信息,其中一个ajax需要执行比较长的时间,用到session的话就得等它执行完了,另一个才能执行。

ASP.NET 会话状态的访问专属于每个会话,如果这两个并发请求是针对同一会话的(通过使用相同的 SessionID 值),则第一个请求将获得对会话信息的独占访问权。 第二个请求将只在第一个请求完成之后执行。 

IT编外人员 | 园豆:95 (初学一级) | 2013-11-28 17:08

@IT编外人员: 你目前已经是有写入的操作SESSION,另一个是读取的SESSION操作。

EnableSessionState="ReadOnly"的这种设置,就算你有这个只读设置 也只是读取锁不互相排斥。但是你有写入操作就没办法再写入SESSION更新值了。

建议你换成其他东西存储 使用CACHE保存。

薛凯凯圆滚滚 | 园豆:36 (初学一级) | 2013-11-28 17:19

@薛凯凯凯凯凯: 

没有写入的,都是查询,id是之前就保存好的

IT编外人员 | 园豆:95 (初学一级) | 2013-11-28 17:25

@IT编外人员: 

我们再来看一下Asp.net MVC中是如何使用Session的。Asp.net平台作为底层的框架,它提供了HttpContext.Session这个成员属性 让我们可以方便地使用Session,但是在MVC中,Controller抽象类为也提供了这样一个属性,我们只要访问它就可以了(支持更好的测试性)。

回想一下,前面我们看到SessionStateModule是根据当前HttpHandler来决定是不是启用Session。但是现在Controller和Page是分开的, Controller又是如何使用Session的呢?要回答这个问题就要扯到路由了,简单地说:现在在MVC处理请求的时候,当前HttpHandler是 MvcHandler类的实例,它有如下定义:

public class MvcHandler : IHttpAsyncHandler, IHttpHandler, IRequiresSessionState {

因此,在Controller.Session中,它是访问的HttpContext.Session,而MvcHandler实现了IRequiresSessionState接口,所以, 访问HttpContext.Session就可以获取到Session 。 注意哦,我上面的代码取自MVC 2.0,从类型实现的接口可以看出,Session将一直有效,不能关闭,而且属于影响并发的那种模式。 所以,此时你只能从web.config中全局关闭它。
说明,在MVC 3.0 和Asp.net 4.0中,才可以支持Controller订制Session的访问性。

在这种使用方式下,如果您不想继续使用Session,可以使用上面我列出的替代方法。

 http://www.cnblogs.com/OpenCoder/archive/2010/01/10/1643659.html 看到下面MVC的SESSION使用 就应该解决你的问题。

薛凯凯圆滚滚 | 园豆:36 (初学一级) | 2013-11-28 17:32

@IT编外人员: 这篇文章指出,你说的设置只读模式在MVC中是没有的,并且还是带读写锁的SESSION。要定制只读的话只有MVC3.0 的控制器才支持对SESSION的访问性定制。

薛凯凯圆滚滚 | 园豆:36 (初学一级) | 2013-11-28 17:52

@薛凯凯凯凯凯: 解决啦?

薛凯凯圆滚滚 | 园豆:36 (初学一级) | 2013-11-29 08:38
其他回答(1)
0

持续关注中

2034029667井上 | 园豆:202 (菜鸟二级) | 2018-10-16 11:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册