URL中的会话ID,模式设置为“SQLServer”

时间:2012-12-22 07:45:32

标签: asp.net asp.net-mvc asp.net-mvc-4 forms-authentication session-state

我正在开发一个使用Webmatrix进行身份验证的ASP.Net MVC 4应用程序。我的web.config文件中有以下内容

<sessionState mode="SQLServer" cookieless="true" allowCustomSqlDatabase="true"
     sqlConnectionString="Data Source=server;Initial Catalog=ASPState;Persist
                          Security Info=True;User ID=user;Password=password" 
     timeout="2880" sqlCommandTimeout="10" />

我可以看到正在填充ASPState数据库,但我仍然在URL中获取会话ID。当我尝试通过Chrome访问它时,它错误地说出许多重定向。当我通过IE访问它时,即使我看到它重定向(虽然会话ID在url中),但是当我尝试使用以下错误登录时出现错误:

  

无法序列化会话状态。在'StateServer'和'SQLServer'模式下,   ASP.NET将序列化会话状态对象,    因此,不可序列化的对象或MarshalByRef对象是   不允许。如果类似的序列化,则适用相同的限制   由“自定义”模式下的自定义会话状态存储完成。

我没有对Webmatrix进行任何自定义,这都是默认的。我需要会话ID不在URL中并使用数据库,就像我在web.config文件中设置它一样

1 个答案:

答案 0 :(得分:2)

首先,尝试将cookieless设置为false。其次,使用ASPState时,allowCustomSqlDatabase应设置为false,第三个不要在连接字符串中指定Initial Catalog。 SQLState将在后台自动执行。第四,我不知道您尝试序列化的是什么,但是您应该将[Serializable]属性放在您尝试存储在会话中的类之上。

对于URL字符串中的会话ID,您使用的是IIS还是IIS Express? IIS使用一个小实用程序aspnet_filter.exe来接受带有会话ID的URL,并在内部将您重定向到正确的地址。当它将信息返回给您时也是如此。 URL再次通过装饰过程。但是,我不确定IIS Express是否使用该实用程序。在某种程度上,在开发者机器上关闭cookie是不太有意义的。