我正在开发一个使用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
文件中设置它一样
答案 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是不太有意义的。