ASP.NET MVC for MonO中的只读会话状态

时间:2014-12-02 21:12:54

标签: c# asp.net asp.net-mvc mono mod-mono

我一直在使用带有单声道主分支的MVC 5,我怀疑单声道是否缺少以下属性的实现:

[SessionState(SessionStateBehavior.ReadOnly)]

我尝试使用属性和Thread.Sleep(5000)来装饰选定的两个控制器。结果显示,这两个请求是按顺序执行的,而不是人们期望的并行执行。

为了提供完整的信息,我一直在使用mod_mono(也是主分支)。

您是否有过单个会话的并行执行经验?

谢谢!

2 个答案:

答案 0 :(得分:0)

请检查以下内容: https://github.com/mono/mono/blob/effa4c07ba850bedbe1ff54b2a5df281c058ebcb/mcs/class/System.Web/System.Web.SessionState_2.0/SessionStateBehavior.cs

请注意,某些Web服务器(如apache)可能会阻止来自同一用户的并发请求,以获取某些环境下的图像以外的资源。如果是这种情况,请告诉我们为您提供更多详细信息。

答案 1 :(得分:0)

我有同样的问题,使用fastcgi-mono-server4 + nginx和xsp4独立,所以我得出结论,在这个版本的mono中它必定是一个bug(或一些非实现的功能)(debian distribution 3.8) -2)。

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

要设置cookie,我在控制器基类中编写了这个覆盖

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);
    }
    //...
}

我添加了一个小助手来获取同一基类中的会话ID

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

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

这解决了我在Mono上的问题,在那里我需要来自同一会话的并发连接,我需要保持每个会话的状态值,但你的里程可能会有所不同。