通过ASP.NET成员资格检查用户角色时出现SemaphoreFullException错误

38
我有一个页面,它在执行某些任务之前检查用户是否处于特定角色中,并且在功能上没有任何问题,也没有对相关代码进行明显的更改。该网站运行在我的开发机器(Windows Vista)上,使用IIS 7.0,并且数据库是在单独的服务器上运行的MS SQL 2005。突然之间,所有调用User.IsInRole都导致如下错误:

System.Threading.SemaphoreFullException: 添加指定数量的信号量将导致超过其最大计数。

我知道重启IIS会“解决”这个问题,但我想了解是什么原因导致这种情况,以便我可以确保在生产环境中不会发生此类问题。
堆栈跟踪的顶部是:

[SemaphoreFullException: 添加指定数量的信号量将导致超过其最大计数。] System.Threading.Semaphore.Release(Int32 releaseCount) +6065293 System.Data.ProviderBase.DbConnectionPool.PutNewObject(DbConnectionInternal obj) +57 System.Data.ProviderBase.DbConnectionPool.DeactivateObject(DbConnectionInternal obj) +338 System.Data.ProviderBase.DbConnectionPool.PutObject(DbConnectionInternal obj, Object owningObject) +163 System.Data.ProviderBase.DbConnectionInternal.CloseConnection(DbConnection owningObject, DbConnectionFactory connectionFactory) +117 System.Data.SqlClient.SqlInternalConnection.CloseConnection(DbConnection owningObject, DbConnectionFactory connectionFactory) +37 System.Data.SqlClient.SqlConnection.Close() +158 System.Web.DataAccess.SqlConnectionHolder.Close() +25 System.Web.Security.SqlRoleProvider.GetRolesForUser(String username) +847 System.Web.Security.RolePrincipal.IsInRole(String role) +182

8个回答

24

通过在Windows任务栏上重新启动ASP.NET开发服务器,解决了此问题。

或者永久地通过在连接字符串中添加“Pooling=False;”来解决该问题。


18
取消池化操作对性能有巨大的影响。这个答案提供了极其糟糕的建议。 - usr
1
谢谢。我同意缺乏性能的问题,但是性能并不是所问的问题。它关于修复错误/问题,顺便说一句,从无法运行应用程序到连接只需几毫秒是性能的巨大增长。我建议调查根本原因,并删除pooling=false选项,如果确实需要使用该选项。http://forums.asp.net/t/1710783.aspx - hagensoft

12

我也偶尔会遇到这个问题。

我认为在我的情况下,是因为我在页面执行期间停止了调试器,所以可能导致数据库连接池出现问题。

这里有一个长串的讨论:http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/b5b7a179-3737-4380-b6cf-843f3e71b317/,有各种用户报告了同样的问题。 没有明确的结论,微软似乎认为我们的应用程序关闭了不应该关闭的句柄。但在我们的应用程序中,至少没有CloseHandle的调用。

如果这是一个真正的数据库连接池bug,我认为早就应该被发现了,因为这是每个asp.net网站都运行的东西...


24
我认为在我的情况下,可能是因为我在页面执行期间停止了调试器,因此数据库连接池可能会出现问题。 - O'Rooney

11

我知道这个问题已经发布过了,但是以下是我得到此问题的方式以及如何解决它。

我的做法 在代码段附近设置断点,该代码段会调用SQL查询。

解决方法 重新启动位于Windows系统托盘中的ASP.NET开发服务器(位于底部右下角的时钟旁边)。


6

当我在一个正在执行SQL语句的代码行上设置断点时,就会出现这种情况。

将断点放在稍后的代码行(而非SQL调用处)可以解决这个问题。


那怎么样?我不确定为什么,但这正是我在看到这个错误之前所做的。我通过关闭系统托盘中的ASP.NET开发服务器 - 端口####来解决了它。 - Lukas

5

重新启动Visual Studio解决了我的问题。我在页面加载期间停止了调试器。


另外,我也重新启动了IIS。 - Flea
我尝试在服务器上回收应用程序池,但这并没有解决问题。但是重新启动Visual Studio(正如您建议的那样)解决了问题。 - Dronz

5

在Windows任务栏上重启ASP.NET Cassini解决了我的问题!


1
今天早上,我每隔一个构建就开始出现这个错误。重启开发本地主机服务器变得非常繁琐,所以我开始深入挖掘。长话短说,有一对SqlConnection/SqlCommand没有被正确释放,对代码进行重构后,异常问题得到了解决。

0

在本地运行IIS时,我遇到了同样的问题。似乎是由于启动站点时停止调试器引起的。运行“iisreset”解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接