ASP.NET 会话状态 sqlConnectionString 的奇怪"Error reading configuration information from the registry."(不是权



总之,似乎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,但我们目前也没有其他的想法。

有人见过这样的东西吗?你有什么建议吗?这是很难谷歌这个错误,因为有类似的投诉日志,是由注册表中给定的适当权限修复的,但我们很确定,这不是我们的情况。

不清楚这是什么。我们不能再繁殖了。目前最好的解释是,我们不知怎么搞砸了权限。

相关内容

  • 没有找到相关文章

最新更新