现有 3 个应用程序:
ASP
ASP.NET 1(位于 ASP 之下)
ASP.NET 2(与 ASP 平级)
经常发生登录会话被踢出的情况,考虑是资源被回收,所以决定将会话保存在 SQL Server 中,于是作如下设置:
会话状态中,选择 SQL Server,如下:
ASP(测试运行成功)
ASP.NET 1(测试运行成功)
ASP.NET 2(未测试)
过了 1 天,有反应说“ASP.NET 2”出错,查看详细信息,错误是:
无法打开登录所请求的数据库 “ASPState”。登录失败。
我就很郁闷了,ASP.NET1、ASP.NET2 并没有什么配置上的本质差异,为什么一个运行正常、一个运行不正常呢。
而且我并没有找到 ASPState 数据库。
网上搜解决方案:
排在前面的是给当前登录账户加上服务器角色,这个解决方案,太差了,不管行不行,我都不希望把自己的账户权限放大那么大。
还搜到一个:
打开 C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/InstallSqlState.sql 将 EXECUTE msdb.dbo.sp_add_category @name = N'[Uncategorized (Local)]' 换成 EXECUTE msdb.dbo.sp_add_category @name = N'[Uncategorized (Localhost)]') 执行
我没多想,我也没有将 Local 换成 Localhost,直接执行的这个脚本,多了个 ASPState 数据库,但脚本出错,再访问应用程序时:
ASP.NET 1(出错,也提示打不开这个数据库,晕,刚才都还好的呀,更郁闷 的是,服务器上,居然没问题!)
ASP.NET 2 (故障依旧)。
于是将 Local 换成 Localhost,再执行,这时脚本没出错了,再访问应用程序时:
然后给账户添加上对 ASPState 的数据库访问权限。
ASP.NET 1(远端访问还是出错,于是给为账户账上 ASPState 数据库的 db_owner 角色,这时出错提示变成了没有 tempdb 这个数据库的 SELECT、INSERT 等权限。关键服务器上测试还是没问题呀。)
于是我又显式地指定了数据库,web.config 中为:
<sessionState allowCustomSqlDatabase="true" mode="SQLServer" sqlCommandTimeout="1200" sqlConnectionString="Server=.;Database=ASPState;Integrated Security=true" />
由于我们指定了数据库,所以需要同时指定“allowCustomSqlDatabase="true"”,不然会出错,IIS UI 界面为勾选上“启用自定义数据库”就是设置的这个属性。
故障依旧。
网上转而搜索:
拒绝了对对象 'ASPStateTempApplications'(数据库 'tempdb',所有者 'dbo')的 SELECT 权限。 拒绝了对对象 'ASPStateTempApplications'(数据库 'tempdb',所有者 'dbo')的 SELECT 权限。 拒绝了对对象 'ASPStateTempApplications'(数据库 'tempdb',所有者 'dbo')的 INSERT 权限。
网上说,他也遇到了,但是他重启服务器后,正常了……
我不敢重启服务器,我只是重启了 SQL Server,错误变成了:
对象名 'tempdb.dbo.ASPStateTempApplications' 无效。