4

此处的 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]被硬编码到框架中。

任何人都可以发现我做错了什么或提供有关如何解决此问题的有用故障排除信息吗?

4

1 回答 1

7

我已经发现了这个问题。我们的 IT 团队通过恢复现有ASPState数据库的备份创建了自定义 ASP 会话状态数据库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

此语句应从我们的 Web 服务器执行。

aspnet_regsql.exe -S *servername* -E -ssadd -sstype c –d DR_ASPState
于 2013-11-18T16:00:10.280 回答