绑定到具有静态变量的HttpContext.Current.Session不起作用

时间:2009-11-12 23:11:19

标签: c# model-view-controller session

原始问题

大家好,

我对MVC如何将HTTP请求映射到会话状态感到困惑。

我的HTTP请求如下所示:

GET / HTTP/1.1
Host: test.net
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.32 Safari/532.0
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

服务器如何知道要映射到哪个用户会话?没有任何标志可以标记我是谁。我猜的唯一方法是它使用请求的源IP吗?

我问的原因是我来自同一公司网络的人(共享相同的公共IP)访问了MVC网站,就像我们共享同一个会话一样。

如果确实使用IP,那么有没有办法将其更改为使用SessionID cookie。我在其他一些帖子中乱搞了web.config,但我没有运气。

非常感谢您的帮助。

谢谢, 克里斯


分辨率

所以,正如大家猜测的那样,事实证明我做了一些非常错误的事情。我创建了一个类来抽象抓取session var的过程。该类具有从会话状态中获取的静态属性:

public class SessionValue
{
    private static HttpSessionState Session = HttpContext.Current.Session;

    private const string stepId = "currentStep";
    private const string username = "username";

    public static int StepId
    {
        get
        {
            if (Session[stepId] == null)
            {
                Session[stepId] = 1;
            }

            return (int)Session[stepId];
        }
        set
        {
            Session[stepId] = value;
        }
    }

    public static string Username
    {
        get
        {
            if (Session[username] == null)
            {
                Username = "";
            }

            return (string)Session[username];
        }
        set
        {
            Session[username] = value;
        }
    }
}

出于某种原因,我假设静态变量声明将在每个Web请求中重新创建,这显然是一个非常醉酒的误解,因为这只会在应用程序首次加载时设置一次。我仍然不知道它实际上是什么绑定,因为它似乎正在维持某种会话。

尽管如此,将属性更改为实际直接使用HttpContext.Current.Session [string]解决了这个问题。谢谢大家的帮助。

2 个答案:

答案 0 :(得分:1)

会话ID存储在您的浏览器发送到服务器的cookie中以及每个请求。

无论如何,这是默认设置。我想你应该能够在标题中看到cookie。你确定你发布的是完整的标题吗?

答案 1 :(得分:1)

您确定会话状态未设置为无Cookie吗? (然后它将从网址获取会话ID)

<sessionState cookieless="true" />

http://yourserver/something/session ID here/something