【问题标题】:Binding to HttpContext.Current.Session w/ Static Variable Does Not Work使用静态变量绑定到 HttpContext.Current.Session 不起作用
【发布时间】:2023-03-26 10:32:01
【问题描述】:

原始问题

大家好,

我对 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,但我没有运气。

非常感谢您的帮助。

谢谢, 克里斯


分辨率

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

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] 解决了这个问题。感谢大家的帮助。

【问题讨论】:

  • 你能提供一些代码来显示你在做什么吗?当您说“会话”时,不清楚您是指 ASP.NET 会话状态功能还是其他东西。因为 ASP.NET 会话状态要么绑定到 cookie,要么绑定到 URL 参数(如果您将网站配置为无 cookie 会话)。
  • 您可以发布您的 web.config 的会话部分吗?

标签: c# model-view-controller session


【解决方案1】:

会话 ID 存储在 cookie 中,您的浏览器随每个请求一起发送到服务器。

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

【讨论】:

  • 是的,这就是我在使用数据包嗅探器(Fiddler)时发现的。其他具有相同 IP 的人似乎共享我的会话似乎也有点奇怪。我知道默认情况下 ASP.NET Web 窗体方法使用存储会话 ID 的 cookie。
  • 在 MVC 中相同。所以你看到饼干了吗?
【解决方案2】:

您确定会话状态未设置为无 cookie 吗? (然后它将从 url 获取会话 id)

<sessionState cookieless="true" />

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

【讨论】:

  • 嗯。你知道这如何与 mvc 路由一起工作吗?你能指定如何在路径中指定 cookie id 吗?
  • 我也读过一些关于这方面的内容......在 MVC 中,URL 会话 ID 跟踪并不是那么简单。这篇文章的第一个答案解释了一种方法,但它并不简单:forums.asp.net/p/1480365/3458971.aspx
  • 抱歉,Simon,我自己从未尝试过使用 MVC。看起来就像是 URL 会话跟踪所发生的事情(例如,如果人们通过电子邮件相互发送链接)。
猜你喜欢
  • 1970-01-01
  • 2012-03-15
  • 2014-08-12
  • 2011-02-11
  • 1970-01-01
  • 2013-10-06
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多