Session与Cookie在换了个数据库之后出现了失效问题,真TMD的摸不着头脑了

redv 2004-08-09 06:15:05
我开始开发的时候使用的是SQLServer来存储数据的,在用户登陆的时候使用了:
Session.Add(Config.GetUserSessionName(), user.Id);
然后在每个需要认证的页面的Page_Load()中加入了如下代码:
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
Mitumori.Authentication.UserAuthenticate(Context);
...
}
----------
Config.cs是这样写的:
public static string GetConnectionString()
{
//http://www.connectionstrings.com/
//return "Provider=sqloledb;Data Source=WebServer;Initial Catalog=Mitumori;User Id=sa;Password=;";//SQLServer
return "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\MITUMORI\\source\\Mitumori\\bin\\data\\MITUMORI.mdb;User Id=admin;Password=;";
}

public static string GetUserSessionName()
{
return "myusersession";
}
----------
Authentication.s是这样写的:
public static void UserAuthenticate(System.Web.HttpContext Context)
{
if(Context.Session[Config.GetUserSessionName()] == null)
{
Context.Response.Redirect(Context.Request.ApplicationPath + "/user/login.aspx?ReturnUrl=" + Context.Request.CurrentExecutionFilePath, true);
}
}


当我仅仅更改了上面Config.cs中的获取连接字符串的那段从SQLServer更改到Access的后,连接数据库当然没有问题,而且我跟踪了一下一切都是照常登录的,但是在UserAuthenticate()中的时候那个if语句竟然变成了true。

我的web.config是这样设置的(我把没用的都注释掉了,特别是那个sessionState节,我更是把它注释和未注释两种状态都尝试过了):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>

<system.web>

<!-- 动态调试编译
设置 compilation debug="true" 以启用 ASPX 调试。否则,将此值设置为
false 将提高此应用程序的运行时性能。
设置 compilation debug="true" 以将调试符号(.pdb 信息)
插入到编译页中。因为这将创建执行起来
较慢的大文件,所以应该只在调试时将此值设置为 true,而在所有其他时候都设置为
false。有关更多信息,请参考有关
调试 ASP.NET 文件的文档。
-->
<compilation
defaultLanguage="c#"
debug="true"
/>

<!-- 自定义错误信息
设置 customErrors mode="On" 或 "RemoteOnly" 以启用自定义错误信息,或设置为 "Off" 以禁用自定义错误信息。
为每个要处理的错误添加 <error> 标记。

"On" 始终显示自定义(友好的)信息。
"Off" 始终显示详细的 ASP.NET 错误信息。
"RemoteOnly" 只对不在本地 Web 服务器上运行的
用户显示自定义(友好的)信息。出于安全目的,建议使用此设置,以便
不向远程客户端显示应用程序的详细信息。
-->
<customErrors
mode="RemoteOnly"
/>

<!-- 身份验证
此节设置应用程序的身份验证策略。可能的模式是 "Windows"、
"Forms"、 "Passport" 和 "None"

"None" 不执行身份验证。
"Windows" IIS 根据应用程序的设置执行身份验证
(基本、简要或集成 Windows)。在 IIS 中必须禁用匿名访问。
"Forms" 您为用户提供一个输入凭据的自定义窗体(Web 页),然后
在您的应用程序中验证他们的身份。用户凭据标记存储在 Cookie 中。
"Passport" 身份验证是通过 Microsoft 的集中身份验证服务执行的,
它为成员站点提供单独登录和核心配置文件服务。
-->
<!--
<authentication mode="Forms">
<forms name=".ASPXCOOKIEDEMO" loginUrl="sys_login.aspx" protection="All" timeout="30" path="/">
</forms>
</authentication>

<authorization>
<deny users="?" />
</authorization>
-->
<!-- 应用程序级别跟踪记录
应用程序级别跟踪为应用程序中的每一页启用跟踪日志输出。
设置 trace enabled="true" 可以启用应用程序跟踪记录。如果 pageOutput="true",则
在每一页的底部显示跟踪信息。否则,可以通过浏览 Web 应用程序
根目录中的 "trace.axd" 页来查看
应用程序跟踪日志。
-->
<!--
<trace
enabled="false"
requestLimit="10"
pageOutput="false"
traceMode="SortByTime"
localOnly="true"
/>-->

<!-- 会话状态设置
默认情况下,ASP.NET 使用 Cookie 来标识哪些请求属于特定的会话。
如果 Cookie 不可用,则可以通过将会话标识符添加到 URL 来跟踪会话。
若要禁用 Cookie,请设置 sessionState cookieless="true"。
-->
<!--
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>-->

<!-- 全球化
此节设置应用程序的全球化设置。
-->
<globalization
requestEncoding="utf-8"
responseEncoding="utf-8"
/>

</system.web>

</configuration>
...全文
351 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
redv 2004-08-10
  • 打赏
  • 举报
回复
我用默认的,也就是你上面的这种写法,不行呀,就是不行,我疯了。
孟子E章 2004-08-10
  • 打赏
  • 举报
回复
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
孟子E章 2004-08-10
  • 打赏
  • 举报
回复
不用数据库存 session信息,呢的配置久不需要修改。因为你的数据库连接写在了类里,与配置没有关系,配置里的设置InProc即可,按默认的就行
redv 2004-08-10
  • 打赏
  • 举报
回复
唉,找到原因了:
下面是msdn里的:
使用进程内会话状态模式时请考虑下面的限制:

使用进程内会话状态模式时,如果 aspnet_wp.exe 或应用程序域重新启动,则会话状态数据将丢失。这些重新启动通常会在下面的情况中发生:
在应用程序的 Web.config 文件的 <processModel> 元素中,设置一个导致新进程在条件被满足时启动的属性,例如 memoryLimit。
修改 Global.asax 或 Web.config 文件。
更改到 Web 应用程序的 \Bin 目录。
用杀毒软件扫描并修改 Global.asax 文件、Web.config 文件或 Web 应用程序的 \Bin 目录下的文件。
如果在应用程序的 Web.config 文件的 <processModel> 元素中启用了网络园模式,请不要使用进程内会话状态模式。否则将发生随机数据丢失。

其中“更改到 Web 应用程序的 \Bin 目录。 ”被我违反了,我把Access数据库文件放在\bin\data里面了,导致一访问Access,那个webapp就重启,这样session就从内存中丢失了(我使用的mode = InProc)。

唉。。。。。。。。。。。。。。。头好大。。。。。。。。。。
以前搞jsp的时候把一些东西放在WEB-INF里面,放习惯了。。。。。。。。。。
redv 2004-08-10
  • 打赏
  • 举报
回复
session的原理我是知道的,至少jsp里的session原理我是知道的。因为我以前就是在搞jsp的,现在应项目要求弄了个asp.net.

又整了一个下午,查资料,跟踪,测试,发现session不能保存。

我使用了Session.Add()后,立即使用Server.Tansefer("a.aspx"),然后在a.aspx里获取那个session是可以的;接着刷新a.aspx发现session又不见了。
但是如果我在Session.Add()后使用Response.Redirect("a.aspx"),然后在a.aspx里获取那个名字的session的vlue就没有了。

而我使用了一个简单的页面来测试session,发现session却是一直存在的,不管我如何刷新。

后来我强制地在Page上加入EnableSessionState="true" ,还是不管用。
我检查了Global.asax,并让它变成默认的(把我写的部分都去掉了),还是不管用。
redv 2004-08-10
  • 打赏
  • 举报
回复
To codeangel: 我使用SQLServer仅仅是来存放我的要用的东西的呀,并没有在程序里面显示地存放session到数据库呀。是不是那个Web.config配置了之后就自动存到数据库了?
还有了那个mode 是InProc呀,根据孟子E章的说法,应该是在本地储存的呀,与数据库无关的呀。反正不管了,我现在的问题就是:

怎么样样才能在使用Access的情况下使用Cookie或者session,条件就是不能使用SQLServer,因为我们这个里面不允许使用它,就是要使用Access,怎样才能做到呢?
codeangel 2004-08-10
  • 打赏
  • 举报
回复
你先要搞清Session原理,给你一个详细介绍asp.net中Session连接:
http://www.blueidea.com/tech/program/2004/1856.asp
接分.
codeangel 2004-08-09
  • 打赏
  • 举报
回复
Session不支持Access数据库的,不能将session信息存入ACCESS的
peering08cn 2004-08-09
  • 打赏
  • 举报
回复
不要注释该配置
peering08cn 2004-08-09
  • 打赏
  • 举报
回复
<!--
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>-->
改成

<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20" />
redv 2004-08-09
  • 打赏
  • 举报
回复
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>
我改成这样还是不行的呀,而且cookie也不能用呀。
另外一点,我在使用SQLServer存储数据的时候,我并不是存储在127.0.0.1上呀,是在另外一台计算机上。
孟子E章 2004-08-09
  • 打赏
  • 举报
回复
mode 属性 :指定在哪里存储会话状态。

Off 指示会话状态未启用。
InProc 指示在本地存储会话状态。
StateServer 指示在远程计算机上存储会话状态。
SQLServer 指示在 SQL Server 上存储会话状态。
孟子E章 2004-08-09
  • 打赏
  • 举报
回复
Session不支持Access数据库吧

62,072

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧