【发布时间】: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