如何从ASP.NET应用中移除ASP.NET_SessionId
嘿,这个问题我之前排查过好几次,大概率是下面几个原因导致的,你可以逐一验证:
确认web.config的配置位置与层级正确性
你已经把<sessionState cookieName="foo" />放在<system.web>节点下了对吧?要确保这个配置是在站点根目录的web.config里,而不是子文件夹的配置文件(子目录配置仅覆盖该目录范围的设置)。另外检查配置文件里有没有其他<sessionState>节点,或是<location>节点覆盖了当前配置。检查会话是否被实际触发
ASP.NET默认是延迟初始化会话——只有当你在代码里实际操作Session对象(比如Session["user"] = "test")时,才会生成会话Cookie。如果只是修改了配置但未使用Session,浏览器可能不会出现fooCookie,你看到的ASP.NET_SessionId大概率是之前缓存的旧Cookie,或是有第三方组件/自定义模块偷偷创建了这个Cookie。清除浏览器旧Cookie后重新测试
浏览器很可能缓存了之前生成的ASP.NET_SessionId,哪怕你修改了配置,旧Cookie依然会保留。先清空浏览器中与当前站点相关的所有Cookie,然后重启应用(最好回收一下应用池),再访问站点并触发Session操作,看看是否只出现fooCookie。排查是否被全局配置覆盖
服务器上的machine.config可能存在全局会话配置,优先级高于项目的web.config。你可以找到对应.NET版本的machine.config(比如.NET Framework 4.x的路径是C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config),搜索<sessionState>节点,如果里面设置了cookieName,会直接覆盖你项目的配置。验证配置是否真正生效
可以在代码里加一段调试代码,确认当前会话Cookie名称是否正确读取了配置:// 在ASPX页面后台或MVC控制器中添加 protected void Page_Load(object sender, EventArgs e) { var sessionConfig = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState"); Response.Write($"当前会话Cookie名称:{sessionConfig.CookieName}"); }如果输出是
foo,说明配置已生效,问题出在浏览器缓存或外部因素;如果还是默认的ASP.NET_SessionId,那就是你的web.config存在语法错误(比如标签未闭合)或未被正确加载。
还有一种小概率情况:如果你的应用设置了cookieless="UseUri"(无Cookie会话模式),则不会生成会话Cookie,但默认模式是UseCookies,所以可以排除这个场景。
内容的提问来源于stack exchange,提问作者sarathy

