IIS 将会话保存在 SQL Server 中后发生的一系列问题

作者:vkvi 来源:ITPOW(原创) 日期:2021-2-7

现有 3 个应用程序:

  • ASP

  • ASP.NET 1(位于 ASP 之下)

  • ASP.NET 2(与 ASP 平级)

经常发生登录会话被踢出的情况,考虑是资源被回收,所以决定将会话保存在 SQL Server 中,于是作如下设置:

会话状态中,选择 SQL Server,如下:

IIS 会话状态

  • 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 这个数据库的 SELECTINSERT 等权限。关键服务器上测试还是没问题呀。)

于是我又显式地指定了数据库,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' 无效。
相关文章