我有一个会话变量,我试图从另一个变量(字符串)给出值。但是,当我这样做时,如下所示,它不存储该值。
DataTable table = new DataTable();
MySqlCommand select = new MySqlCommand("SELECT personID, address_addressID from person WHERE email='" + emailAddress + "' and password = '" + passwordR + "'", connect); //brings back the person ID if user details are correct
using (MySqlDataAdapter adapter = new MySqlDataAdapter(select))
{
adapter.Fill(table);
if (table.Rows.Count != 0)
{
string sessionVar = table.Rows[0]["personID"].ToString();
Session["personID"] = sessionVar;
sessionVar变量是正确的数据但不会输入到Session中,这是不是错误地完成了?
编辑:我已经包含了一些更多的上下文来制作这个MVCE。
答案 0 :(得分:2)
问题摘要:在分配Response.Redirect(URL, true);
数据后使用Session
时,您会发现它不会被存储。您需要在方法上使用return;
并使用Response.Redirect(URL, false);
。
的说明:强>
可以找到一个很好的解释Twitter。这是主要部分的片段:
当您创建新会话(即第一次写入Session变量)时,ASP.NET会在包含会话令牌的客户端上设置易失性cookie。在所有后续请求中,只要服务器会话和客户端cookie未过期,ASP.NET就可以查看此cookie并找到正确的会话。 现在,重定向的作用是向客户端发送一个特殊的标头,以便它向服务器请求与其等待的页面不同的页面。服务器端,在发送此标头后,重定向结束响应。这是一件非常暴力的事情。 Response.End实际上使用ThreadAbortException停止页面的执行。 这里真正发生的是会话令牌在战斗中丢失。
答案 1 :(得分:0)
您是否能够在相同的请求上下文中访问会话值,但不能在后续请求中访问会话值?
Asp.net的默认实现是将会话ID存储在cookie中,以便可以在后续请求中对其进行访问。创建会话后,检查您的浏览器cookie,以查看会话ID是否存在。 Chrome不会为不安全的网站存储Cookie,因此,如果您是从本地主机运行的,则可能需要使用其他浏览器进行测试。
有关在chrome中为不安全的网站存储cookie的信息,请参见以下答案: Cookies no longer save for insecure sites in Google Chrome