2014-12-02 125 views
1

我使用MVC 5单的主分支了,我怀疑是单声道有失踪实施以下属性:只读会话状态MONO

[SessionState(SessionStateBehavior.ReadOnly)] 

我试图来装饰选择的两个具有属性和Thread.Sleep(5000)的控制器。结果表明,这两个请求是按顺序执行的,而不是像预期的那样。

为了给出一个完整的信息,我一直在使用mod_mono(也是master分支)。

对于单个会话你有并行执行经验吗?

谢谢!

回答

0

请检查引用: https://github.com/mono/mono/blob/effa4c07ba850bedbe1ff54b2a5df281c058ebcb/mcs/class/System.Web/System.Web.SessionState_2.0/SessionStateBehavior.cs

请注意,某些Web服务器,如Apache,可能会阻止来自同一用户比在一定circunstances图像其他资源的并发请求。如果这是你的情况,让我知道给你提供更多的细节。

+0

这就是参考,我使用这个枚举作为属性。请问如何调试Apache服务器和运行asp.net服务器(mod_mono)之间的通信?我希望更多的细节。 – marxin 2014-12-04 20:24:18

0

我有同样的问题,与fastcgi-mono-server4 + nginx和xsp4独立,所以我得出结论,它必须是一个错误(或一些未实现的功能)在这个版本的单声道(debian分布3.8-2)。

我在web.config中解决了设置<sessionState mode="Off" />的问题,并在服务器端使用System.Runtime.Caching.MemoryCache处理会话,并使用由GUID(用于会话ID仿真)和实际字符串组成的密钥。

设置我在我的控制器基类

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if(HttpContext.Request.Cookies["sid"] == null 
     && HttpContext.Response.Cookies["sid"] == null) { 
     HttpCookie htsid = new HttpCookie("sid", Guid.NewGuid().ToString()); 
     HttpContext.Response.Cookies.Set(htsid); 
    } 
    //... 
} 

写此覆盖的饼干和我添加了一个小帮手,以获得相同的基类

internal string sid { 
    get { 
     HttpCookie htk = HttpContext.Request.Cookies["sid"]; 
     if(htk == null) { 
      htk = HttpContext.Response.Cookies["sid"]; 
     } 

     return htk == null ? null : htk.Value; 
    } 
} 

这解决了会话ID我单声道问题,我确实需要来自同一个会话的并发连接,我需要保持每个会话的状态值,但是您的里程可能会有所不同。