0

我正在开发一个使用 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文件中设置的一样

4

1 回答 1

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 并没有太大意义。

于 2012-12-22T07:55:07.740 回答