此处的 Microsoft 文档
http://msdn.microsoft.com/en-us/library/h6bb9cz9(v=vs.90).aspx
和几篇 SO 文章表明,在 ASP.NET web.config 文件的 sessionState 声明中指定 allowCustomSqlDatabase="true" 将允许我使用默认的 ASPState 数据库进行覆盖并指定我自己的数据库名称。
我在 web.config 文件中设置了这些属性。
<sessionState allowCustomSqlDatabase="true" mode="SQLServer" sqlConnectionString="Data Source=mysqlservername;Initial Catalog=DR_ASPState;Integrated Security=true;Connect Timeout=15;" />
当我尝试打开默认网站页面时,收到一条错误消息,指示无法访问 ASPState 数据库。
我使用 SQL Profiler 监控了 SQL 流量,并注意到失败是由以下请求引起的:
SELECT @appId = AppId
FROM [ASPState].dbo.ASPStateTempApplications
WHERE AppName = @appName
我已经回收了应用程序池并重新启动了 IIS,试图刷新可能存在的任何缓存数据库名称引用,但这没有帮助。我的理解是,ASP.NET SessionState 将使用我指定的数据库名称 DR_ASPState 来生成用于连接到 SessionState 数据库的 SQL 语句。但看起来[ASPState]确实是硬编码到框架中的。
任何人都可以发现我做错了什么,或者提供有关如何解决此问题的有用的故障排除信息吗?
最佳答案
我已经发现了这个问题。我们的 IT 团队通过恢复现有 ASPState 数据库的备份,创建了自定义 ASP session 状态数据库 DR_ASPState。但是,仅提供不同的名称不会更改使用硬编码数据库引用生成的存储过程。
网站正在调用我的连接字符串中定义的正确备用数据库DR_ASPState。但是,.NET 命令生成的存储过程中至少有一个在存储过程语句中具有硬编码的数据库名称。
使用 SQL Profiler,我发现这是使用重命名的数据库导致问题的语句
declare @p2 int
set @p2=NULL
exec dbo.TempGetAppID @appName='/LM/W3SVC/10/ROOT',@appId=@p2 output
select @p2
检查存储过程 dbo.TempGetAppID 显示如下语句:
SELECT @appId = AppId
FROM [ASPState].dbo.ASPStateTempApplications
WHERE AppName = @appName
按照此处 .NET 文档中的说明,通过正确安装 DR_ASPState 作为新数据库可以正确解决此问题。
http://msdn.microsoft.com/en-us/library/ms229862(v=vs.80).aspx
该语句应从我们的网络服务器执行。
aspnet_regsql.exe -S *servername* -E -ssadd -sstype c –d DR_ASPState
关于带有allowCustomSqlDatabase ="true"的ASP.NET SessionState不调用指定的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19749837/