奇怪的是“从注册表中读取配置信息时出错”。 for ASP.NET sessionState sqlConnectionString(不是权限)

时间:2011-09-08 19:45:32

标签: asp.net windows-server-2008 connection-string session-state asp.net-4.0

简而言之,如果连接字符串足够长,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设置):

  • 我们临时创建了一个密码为“a”的SQL Server用户“a”,并在连接字符串中使用他。这似乎也“解决了”这个问题。
  • 我们为现有用户输入错误的1个字符长的密码到连接字符串中,并且错误预计会更改为无法登录到SQL Server。
  • 我们把明显错误(但很短)的连接字符串和错误更改为关于错误字符串格式的内容。

我们现在提供的每一个证据都指出,注册表中相对较长的加密连接字符串有问题,但不清楚是什么以及为什么。为什么我们之前的环境(Windows Server 2003 + ASP.NET 2.0)中没有这样的东西呢?实际上很难相信这样一个奇怪的错误,但我们现在还没有其他想法。

以前有人见过这样的事吗?你有什么建议吗?很难谷歌这个错误,因为有一个类似的抱怨日志,通过在注册表中给定适当的权限来修复,但我们非常肯定这不是我们的情况。

1 个答案:

答案 0 :(得分:0)

目前尚不清楚这是什么。我们不能再复制它了。我们现在最好的解释是,我们设法弄乱了权限。