总之,似乎ASP。如果连接字符串足够长,NET无法读取会话状态的加密连接字符串。
详情如下:
我们正在同步升级到Windows Server 2008和ASP。NET 4,无法设置我们的开发环境。我们将会话状态存储在SQL Server中,并在web.config
中进行相应的配置。<sessionState mode="SQLServer" sqlConnectionString="registry:HKLMSoftwareSomeAppNameSessionStateASPNET_SETREG,sqlConnectionString" cookieless="false" timeout="640" allowCustomSqlDatabase="true" />
在注册表中使用
创建条目aspnet_setreg.exe -k:SoftwareSomeAppNameSessionState -c:"data source=SomeSqlServerINST3;initial Catalog=AspStateDb;user id=some-user;password=some-password"
并将其从WOW6432NODE复制到适当的位置并应用适当的权限(对整个子树HKLMSoftwareSomeAppName给予NETWORK_SERVICES完全控制)。
这就是奇怪的事情开始的地方。当我们尝试在浏览器中打开应用程序时,我们得到"从注册表读取配置信息错误",错误指向sessionstate配置。以下是来自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:inetpubwwwrootSomeAppName
Machine name: SomeWebServer
Process information:
Process ID: 4044
Process name: w3wp.exe
Account name: NT AUTHORITYNETWORK SERVICE
Exception information:
Exception type: ConfigurationErrorsException
Exception message: Error reading configuration information from the registry. (C:inetpubwwwrootSomeAppNameweb.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 AUTHORITYNETWORK SERVICE
Thread information:
Thread ID: 3
Thread account name: NT AUTHORITYNETWORK 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实际上成功地读取了注册表项。"工作"one_answers"不工作"之间的唯一区别似乎是,在工作情况下,w3wp.exe在一次尝试中读取它,而在"不工作"中,第一次尝试失败,缓冲区溢出(可能完全无关,但看起来可疑)。
我们当前的解决方案与我们看到的行为一样奇怪:我们显式地向hosts文件添加了条目,以使"SomeSqlServer"的别名更短,仅为"s"(一个字符)。这似乎减少连接字符串足以使其工作。然而,目前还不清楚发生了什么,以及为什么这有帮助。
我们的"不工作"连接字符串大约有90个字符长。"正常工作"的那个小于80。我们没有花时间去寻找确切的边缘。
我们还尝试以其他方式缩短注册表中的连接字符串(使用aspnet_setreg.exe设置):
- 我们临时创建了一个SQL Server用户"a"和密码"a",并使用他的连接字符串。这似乎也"修复"这个问题。
- 我们在连接字符串中输入了错误的1个字符长的现有用户密码,错误预期为无法登录SQL Server。
- 我们把错误的(但短)连接字符串和错误更改为错误的字符串格式。
我们现在拥有的每一个证据都指向我们,注册表中相对较长的加密连接字符串有问题,但不清楚是什么和为什么。为什么我们在以前的环境(Windows Server 2003 + ASP)中没有这样的东西?NET 2.0) ?事实上,很难相信会有这样一个奇怪的bug,但我们目前也没有其他的想法。
有人见过这样的东西吗?你有什么建议吗?这是很难谷歌这个错误,因为有类似的投诉日志,是由注册表中给定的适当权限修复的,但我们很确定,这不是我们的情况。
不清楚这是什么。我们不能再繁殖了。目前最好的解释是,我们不知怎么搞砸了权限。