简而言之,如果连接字符串足够长,ASP.NET似乎无法读取会话状态的加密连接字符串。
以下是详细信息:
我们正在同时升级到Windows Server 2008和ASP.NET 4,无法设置我们的开发环境。我们将会话状态存储在SQL Server中,并在web.config
中进行相应的配置<sessionState mode="SQLServer" sqlConnectionString="registry:HKLM\Software\SomeAppName\SessionState\ASPNET_SETREG,sqlConnectionString" cookieless="false" timeout="640" allowCustomSqlDatabase="true" />
我们在
注册表中创建了条目aspnet_setreg.exe -k:Software\SomeAppName\SessionState -c:"data source=SomeSqlServer\INST3;initial Catalog=AspStateDb;user id=some-user;password=some-password"
并将其从WOW6432NODE复制到适当的位置并应用适当的权限(将NETWORK_SERVICES的完全控制权交给整个子树HKLM \ Software \ SomeAppName)。
这就是奇怪的事情开始的地方。当我们尝试在浏览器中打开应用程序时,我们会收到“从注册表中读取配置信息时出错”。指向sesssionState配置的错误。以下是EventViewer的详细信息
Event code: 3008
Event message: A configuration error has occurred.
Event time: 9/8/2011 7:32:02 AM
Event time (UTC): 9/8/2011 2:32:02 PM
Event ID: 6e68be241c3d4105a0dec4de7b3724d0
Event sequence: 2
Event occurrence: 1
Event detail code: 0
Application information:
Application domain: /LM/W3SVC/blah-blah-blah
Trust level: Full
Application Virtual Path: /SomeAppName
Application Path: C:\inetpub\wwwroot\SomeAppName
Machine name: SomeWebServer
Process information:
Process ID: 4044
Process name: w3wp.exe
Account name: NT AUTHORITY\NETWORK SERVICE
Exception information:
Exception type: ConfigurationErrorsException
Exception message: Error reading configuration information from the registry. (C:\inetpub\wwwroot\SomeAppName\web.config line 89)
Request information:
Request URL: http://SomeWebServer/SomeAppName/default.aspx
Request path: /SomeAppName/default.aspx
User host address: 10.X.X.X
User:
Is authenticated: False
Authentication Type:
Thread account name: NT AUTHORITY\NETWORK SERVICE
Thread information:
Thread ID: 3
Thread account name: NT AUTHORITY\NETWORK SERVICE
Is impersonating: False
Stack trace: at System.Web.Configuration.ConfigsHelper.GetRegistryStringAttribute(String& val, ConfigurationElement config, String propName)
at System.Web.SessionState.SqlSessionStateStore.OneTimeInit()
at System.Web.SessionState.SqlSessionStateStore.Initialize(String name, NameValueCollection config)
at System.Web.SessionState.SqlSessionStateStore.Initialize(String name, NameValueCollection config, IPartitionResolver partitionResolver)
at System.Web.SessionState.SessionStateModule.InitModuleFromConfig(HttpApplication app, SessionStateSection config)
at System.Web.SessionState.SessionStateModule.Init(HttpApplication app)
at System.Web.HttpApplication.InitModulesCommon()
at System.Web.HttpApplication.InitInternal(HttpContext context, HttpApplicationState state, MethodInfo[] handlers)
at System.Web.HttpApplicationFactory.GetNormalApplicationInstance(HttpContext context)
at System.Web.HttpApplicationFactory.GetApplicationInstance(HttpContext context)
at System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)
奇怪的是,这个错误似乎取决于sql连接字符串内容的长度。我们使用了SysInternals ProcMon,看到w3wp.exe确实成功读取了注册表项。 “工作”和“不工作”之间的唯一区别似乎是在工作情况下w3wp.exe在一次尝试中读取它而在“不工作”时第一次尝试失败并且缓冲区溢出(可能完全不相关但看起来很可疑)。 / p>
我们当前的解决方案与我们看到的行为一样奇怪:我们明确地将条目添加到hosts文件中,以便将“SomeSqlServer”的更短别名设为“s”(一个字符)。这似乎减少了连接字符串足以使其工作。然而,目前尚不清楚会发生什么以及为什么这会有所帮助。
我们的“无法工作”连接字符串长度约为90个字符。 “工作”一个小于80.我们没有花时间找到确切的优势。
我们还尝试以其他方式缩短注册表中的连接字符串(使用aspnet_setreg.exe设置):
我们现在提供的每一个证据都指出,注册表中相对较长的加密连接字符串有问题,但不清楚是什么以及为什么。为什么我们之前的环境(Windows Server 2003 + ASP.NET 2.0)中没有这样的东西呢?实际上很难相信这样一个奇怪的错误,但我们现在还没有其他想法。
以前有人见过这样的事吗?你有什么建议吗?很难谷歌这个错误,因为有一个类似的抱怨日志,通过在注册表中给定适当的权限来修复,但我们非常肯定这不是我们的情况。
答案 0 :(得分:0)
目前尚不清楚这是什么。我们不能再复制它了。我们现在最好的解释是,我们设法弄乱了权限。