【发布时间】:2010-09-21 20:46:41
【问题描述】:
我正在尝试跟踪某些内容并使用 SessionID 作为该对象的关键
但是每 2-3 次请求更改的 SessionID 不应该保持不变吗?
HttpContext.Session.SessionID
是我正在使用的代码。
【问题讨论】:
标签: asp.net-mvc session
我正在尝试跟踪某些内容并使用 SessionID 作为该对象的关键
但是每 2-3 次请求更改的 SessionID 不应该保持不变吗?
HttpContext.Session.SessionID
是我正在使用的代码。
【问题讨论】:
标签: asp.net-mvc session
我已经看到即使没有 MVC 也会发生这种情况。如果我没记错的话,ASP.NET 会一直分配新的会话 ID,直到您将某些内容放入 Session 变量中。
【讨论】:
您应该在 Global.asax.cs 中初始化 Session 对象。
void Session_Start(object sender, EventArgs e)
{
HttpContext.Current.Session.Add("__MyAppSession", string.Empty);
}
除非您的浏览器窗口关闭,否则会话不会改变。
【讨论】:
我正在开发一个 .NET MVC 购物车应用程序并添加了
Session["myVar"] = "1234";
到 Default.aspx.cs 代码中的 Page_Load 方法。我也加了
<%= this.Session.SessionID %>
到 Site.Master 页脚。然后我重新构建了我的应用程序并浏览了我的应用程序的各个页面,页脚按预期显示所有页面的相同会话 ID!
【讨论】:
如果您查看,除非在服务器上使用,否则会话 ID cookie 甚至不会发送到浏览器。
所以当页面往返时没有当前会话 ID cookie,因此会创建一个新的会话 ID,因此它是随机的。
这是合乎逻辑的,如果会话未在使用中,为什么还要将应用程序绑定到会话?
【讨论】:
我会考虑使用 TempData 来跟踪某些内容。
【讨论】:
尝试将机器密钥添加到您的 web.config 中:
在线密钥生成器:http://aspnetresources.com/tools/keycreator.aspx
似乎服务器每隔几分钟就会为客户端重置机器密钥并生成具有新会话 ID 的新密钥,这比它应该的要低得多。不知道这是错误还是功能:)
此外,您可以增加会话状态超时,我认为默认为 20 分钟。
【讨论】:
我在使用 ASP.NET Web 窗体时遇到了同样的问题。我只需要在解决方案中添加一个global.asax 文件并为我修复它。
【讨论】:
总结以上@jrojo 和@Maxam 的答案,以及我正在使用的内容。
我使用 AWS DynamoDB 作为会话存储(超出了问题的范围,但提供了示例)。
通过 NUGET 添加包: 安装包 AWS.SessionProvider
更新 Web.config 以在 appSettings 中有键:
<add key="AWSAccessKey" value="XXX" />
<add key="AWSSecretKey" value="YYY" />
和 system.web 的会话提供者:
<sessionState timeout="20"
mode="Custom"
customProvider="DynamoDBSessionStoreProvider">
<providers>
<add name="DynamoDBSessionStoreProvider"
type="Amazon.SessionProvider.DynamoDBSessionStateStore, AWS.SessionProvider"
AWSProfilesLocation=".aws/credentials"
Table="ASP.NET_SessionState"
Region="us-east-1"
/>
</providers>
</sessionState>
在会话开始时向 global.asax 中的会话添加任何内容:
void Session_Start(object sender, EventArgs e) {
HttpContext.Current.Session.Add("somethingToForceSessionIdToStick", string.Empty);
}
通过将此添加到任何页面的剃须刀进行验证。刷新该页面,然后打开一个 ignito 窗口并查看不同的会话:
@HttpContext.Current.Session.SessionID
【讨论】:
请查看您是否已将 cookie 的 samesite 属性设置为严格。
删除 cookieSameSite="Strict" 并检查。
【讨论】: