ASP.NET MVC下服务器响应头没有set-cookie,导致每次请求都生成新的sessionID

时间:2022-12-29 13:23:16
使用session时,在不带ASP.NET_SessionId这个cookie去请求的时候,服务器端会生成一个sessionID放到cookie里面,下次带过去。
但是在ASP.NET MVC4项目中,每次请求服务器端都生成了新的sessionID,因为服务器端的headers里面没有set-cookie这一项,实在很让人困惑啊。
对比webform项目和asp.net mvc4项目如下(都是示例项目)
webform:
在请求头中没有cookie的时候,服务器端有set-cookie
ASP.NET MVC下服务器响应头没有set-cookie,导致每次请求都生成新的sessionID

ASP.NET MVC4:
因为都是开发服务器(domain都是localhost),所以关闭浏览器程序打开,再去测试mvc的
可以看到客户端没有cookie,服务器端也没有set-cookie,这就导致每次请求得到的都是一个新的sessionID
ASP.NET MVC下服务器响应头没有set-cookie,导致每次请求都生成新的sessionID

不知道大家有没有遇到过这个问题。。我也觉得很奇怪,不知道问题出在哪里,用cookieless模式是正常的。
求助啊 ASP.NET MVC下服务器响应头没有set-cookie,导致每次请求都生成新的sessionID

10 个解决方案

#1



HttpCookie cookie = new HttpCookie("MyCookieName", "hohoho");
Response.Cookies.Add(cookie);

使用这样的语句手动写cookie到客户端是可以的。
会在响应头里面发现“Set-Cookie MyCookieName=hohoho; path=/”

那session那里是出了什么问题呢?

#2


你session里有存值吗
session没有存值的情况下是不会在服务器端生成的

#3


若服务器没有设置cookie 和Session   

客户端的SessionID 每次都是变化的,每次都new一个

一旦设置 设置cookie或Session任意一个,sessionID将固定下来。

#4


引用 2 楼 ltcszk 的回复:
你session里有存值吗
session没有存值的情况下是不会在服务器端生成的

看来是这个问题
session不存值的话,虽然有生成的sessionID了,但是不会给响应头添加set-cookie

能不能再请教个问题,除了Session["test"] = 123;这样赋值使用的形式,有什么简单直接的方式让Session向客户端发送set-cookie吗?
还是说只能手动去写set-cookie,然后把sessionID的值给ASP.NET_SessionId?

#5


引用 3 楼 bo3235 的回复:
若服务器没有设置cookie 和Session   

客户端的SessionID 每次都是变化的,每次都new一个

一旦设置 设置cookie或Session任意一个,sessionID将固定下来。

你说的设置是指填充值是吗?
刚才试了下,session添加值是可以的,cookie里面添加值不影响。

能不能再请教个问题,除了Session["test"] = 123;这样赋值使用的形式,有什么简单直接的方式让Session向客户端发送set-cookie吗?
还是说只能手动去写set-cookie,然后把sessionID的值给ASP.NET_SessionId?

#6


引用 4 楼 KongHuLu 的回复:
Quote: 引用 2 楼 ltcszk 的回复:

你session里有存值吗
session没有存值的情况下是不会在服务器端生成的

看来是这个问题
session不存值的话,虽然有生成的sessionID了,但是不会给响应头添加set-cookie

能不能再请教个问题,除了Session["test"] = 123;这样赋值使用的形式,有什么简单直接的方式让Session向客户端发送set-cookie吗?
还是说只能手动去写set-cookie,然后把sessionID的值给ASP.NET_SessionId?


为什么需要生成sessionID?直接说下需求吧
session不存在的话,就算生成sessionid,下次访问也无法找到匹配的session的

#7


引用 6 楼 ltcszk 的回复:
Quote: 引用 4 楼 KongHuLu 的回复:

Quote: 引用 2 楼 ltcszk 的回复:

你session里有存值吗
session没有存值的情况下是不会在服务器端生成的

看来是这个问题
session不存值的话,虽然有生成的sessionID了,但是不会给响应头添加set-cookie

能不能再请教个问题,除了Session["test"] = 123;这样赋值使用的形式,有什么简单直接的方式让Session向客户端发送set-cookie吗?
还是说只能手动去写set-cookie,然后把sessionID的值给ASP.NET_SessionId?


为什么需要生成sessionID?直接说下需求吧
session不存在的话,就算生成sessionid,下次访问也无法找到匹配的session的

需要一个标识会话的KEY,然后缓存中有些数据存储的时候,键是根据会话KEY拼接的,理所当然地想到了用sessionID。

不过既然如此的话,就存一部分数据到session好了,这样就触发服务器端向客户端发送set-cookie。

#8


引用 6 楼 ltcszk 的回复:
Quote: 引用 4 楼 KongHuLu 的回复:

Quote: 引用 2 楼 ltcszk 的回复:

你session里有存值吗
session没有存值的情况下是不会在服务器端生成的

看来是这个问题
session不存值的话,虽然有生成的sessionID了,但是不会给响应头添加set-cookie

能不能再请教个问题,除了Session["test"] = 123;这样赋值使用的形式,有什么简单直接的方式让Session向客户端发送set-cookie吗?
还是说只能手动去写set-cookie,然后把sessionID的值给ASP.NET_SessionId?


为什么需要生成sessionID?直接说下需求吧
session不存在的话,就算生成sessionid,下次访问也无法找到匹配的session的

或者在使用SessionID之前,这样写

Session["Activation"] = 1;
Session.RemoveAll();

有点丑,不过能解决问题
Reflector看看MVC下的Session第一次添加值会做什么,看看有没有好一点的办法,不行就这样了。

#9


而且,ASP.NET MVC和Webform下的处理居然是不同的。
webform下不赋值也直接会给客户端发送set-cooke

#10


今天也遇到这个奇葩问题,在Global 加上这段代码就OK了。

protected void Session_Start(object sender, EventArgs e)
        {

        }

        protected void Session_End(object sender, EventArgs e)
        {

        }  

#1



HttpCookie cookie = new HttpCookie("MyCookieName", "hohoho");
Response.Cookies.Add(cookie);

使用这样的语句手动写cookie到客户端是可以的。
会在响应头里面发现“Set-Cookie MyCookieName=hohoho; path=/”

那session那里是出了什么问题呢?

#2


你session里有存值吗
session没有存值的情况下是不会在服务器端生成的

#3


若服务器没有设置cookie 和Session   

客户端的SessionID 每次都是变化的,每次都new一个

一旦设置 设置cookie或Session任意一个,sessionID将固定下来。

#4


引用 2 楼 ltcszk 的回复:
你session里有存值吗
session没有存值的情况下是不会在服务器端生成的

看来是这个问题
session不存值的话,虽然有生成的sessionID了,但是不会给响应头添加set-cookie

能不能再请教个问题,除了Session["test"] = 123;这样赋值使用的形式,有什么简单直接的方式让Session向客户端发送set-cookie吗?
还是说只能手动去写set-cookie,然后把sessionID的值给ASP.NET_SessionId?

#5


引用 3 楼 bo3235 的回复:
若服务器没有设置cookie 和Session   

客户端的SessionID 每次都是变化的,每次都new一个

一旦设置 设置cookie或Session任意一个,sessionID将固定下来。

你说的设置是指填充值是吗?
刚才试了下,session添加值是可以的,cookie里面添加值不影响。

能不能再请教个问题,除了Session["test"] = 123;这样赋值使用的形式,有什么简单直接的方式让Session向客户端发送set-cookie吗?
还是说只能手动去写set-cookie,然后把sessionID的值给ASP.NET_SessionId?

#6


引用 4 楼 KongHuLu 的回复:
Quote: 引用 2 楼 ltcszk 的回复:

你session里有存值吗
session没有存值的情况下是不会在服务器端生成的

看来是这个问题
session不存值的话,虽然有生成的sessionID了,但是不会给响应头添加set-cookie

能不能再请教个问题,除了Session["test"] = 123;这样赋值使用的形式,有什么简单直接的方式让Session向客户端发送set-cookie吗?
还是说只能手动去写set-cookie,然后把sessionID的值给ASP.NET_SessionId?


为什么需要生成sessionID?直接说下需求吧
session不存在的话,就算生成sessionid,下次访问也无法找到匹配的session的

#7


引用 6 楼 ltcszk 的回复:
Quote: 引用 4 楼 KongHuLu 的回复:

Quote: 引用 2 楼 ltcszk 的回复:

你session里有存值吗
session没有存值的情况下是不会在服务器端生成的

看来是这个问题
session不存值的话,虽然有生成的sessionID了,但是不会给响应头添加set-cookie

能不能再请教个问题,除了Session["test"] = 123;这样赋值使用的形式,有什么简单直接的方式让Session向客户端发送set-cookie吗?
还是说只能手动去写set-cookie,然后把sessionID的值给ASP.NET_SessionId?


为什么需要生成sessionID?直接说下需求吧
session不存在的话,就算生成sessionid,下次访问也无法找到匹配的session的

需要一个标识会话的KEY,然后缓存中有些数据存储的时候,键是根据会话KEY拼接的,理所当然地想到了用sessionID。

不过既然如此的话,就存一部分数据到session好了,这样就触发服务器端向客户端发送set-cookie。

#8


引用 6 楼 ltcszk 的回复:
Quote: 引用 4 楼 KongHuLu 的回复:

Quote: 引用 2 楼 ltcszk 的回复:

你session里有存值吗
session没有存值的情况下是不会在服务器端生成的

看来是这个问题
session不存值的话,虽然有生成的sessionID了,但是不会给响应头添加set-cookie

能不能再请教个问题,除了Session["test"] = 123;这样赋值使用的形式,有什么简单直接的方式让Session向客户端发送set-cookie吗?
还是说只能手动去写set-cookie,然后把sessionID的值给ASP.NET_SessionId?


为什么需要生成sessionID?直接说下需求吧
session不存在的话,就算生成sessionid,下次访问也无法找到匹配的session的

或者在使用SessionID之前,这样写

Session["Activation"] = 1;
Session.RemoveAll();

有点丑,不过能解决问题
Reflector看看MVC下的Session第一次添加值会做什么,看看有没有好一点的办法,不行就这样了。

#9


而且,ASP.NET MVC和Webform下的处理居然是不同的。
webform下不赋值也直接会给客户端发送set-cooke

#10


今天也遇到这个奇葩问题,在Global 加上这段代码就OK了。

protected void Session_Start(object sender, EventArgs e)
        {

        }

        protected void Session_End(object sender, EventArgs e)
        {

        }