Jon*_*ley 4 sql sql-server asp.net sql-session-state
这里的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;" />
Run Code Online (Sandbox Code Playgroud)
当我尝试调出默认网站页面时,收到一条错误消息,指出无法访问ASPState数据库.
我已使用SQL事件探查器监视SQL流量,并注意到此故障是由此请求引起的:
SELECT @appId = AppId
FROM [ASPState].dbo.ASPStateTempApplications
WHERE AppName = @appName
Run Code Online (Sandbox Code Playgroud)
我已经回收了应用程序池并重新启动了IIS,试图刷新可能存在的任何缓存的数据库名称引用,但这没有帮助.我的理解是ASP.NET SessionState将使用我指定的数据库名称DR_ASPState来生成它用于连接到SessionState数据库的SQL语句.但看起来似乎[ASPState]被硬编码到框架中.
任何人都可以发现我做错的任何事情或提供有关如何解决这个问题的有用的故障排除信息吗?
我发现了这个问题.我们的IT团队已经创建的自定义ASP会话状态数据库,DR_ASPState,通过恢复我们现有的备份ASPState的数据库.但是,仅提供不同的名称不会更改使用硬编码数据库引用生成的存储过程.
该网站正在调用我的连接字符串中定义的正确备用数据库DR_ASPState.但是,.NET命令生成的至少一个存储过程在存储过程语句中具有硬编码的数据库名称.
使用SQL事件探查器,我发现这是使用重命名的数据库导致问题的语句
declare @p2 int
set @p2=NULL
exec dbo.TempGetAppID @appName='/LM/W3SVC/10/ROOT',@appId=@p2 output
select @p2
Run Code Online (Sandbox Code Playgroud)
检查存储过程dbo.TempGetAppID显示如下语句:
SELECT @appId = AppId
FROM [ASPState].dbo.ASPStateTempApplications
WHERE AppName = @appName
Run Code Online (Sandbox Code Playgroud)
根据此处.NET文档中的说明,通过正确安装DR_ASPState作为新数据库,可以正确解决此问题.
http://msdn.microsoft.com/en-us/library/ms229862(v=vs.80).aspx
该声明应该从我们的Web服务器执行.
aspnet_regsql.exe -S *servername* -E -ssadd -sstype c –d DR_ASPState
Run Code Online (Sandbox Code Playgroud)