我有一个页面,在执行某项任务之前检查用户是否处于特定角色,并且对功能没有任何问题,并且没有对相关代码进行明显的相关更改。该站点位于运行IIS 7.0的开发计算机(Windows Vista)上,数据库位于单独的服务器上,是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
答案 0 :(得分:24)
通过在Windows任务栏上重新启动ASP.NET Development Server来解决此问题。
或永久添加'Pooling = False;'连接字符串应解决问题。
答案 1 :(得分:11)
我偶尔也会得到它。
我相信在我的情况下,它发生是因为我在页面执行期间停止了调试器,所以可能数据库连接池搞砸了。
与各种用户报告相同的事情。 没有明确的结论,微软似乎觉得我们的应用程序正在关闭他们不应该处理的句柄。但在我们的应用程序中至少没有CloseHandle调用。
如果它是数据库连接池中的真正错误,我会认为它很久以前就会被发现,因为这是运行每个asp.net网站的东西......
答案 2 :(得分:10)
我知道它已被发布,但这是我如何得到它,以及解决它的原因。
我做了什么 在发出SQL调用的代码段附近放置一个断点。
解决了什么 在Windows系统托盘中重新启动ASP.NET Development Server(在右下角的时钟旁边)
答案 3 :(得分:6)
当我在正在进行SQL调用的行上插入断点时,发生了这种情况。
稍后放置断点(不是在SQL调用中)解决了我的问题。
答案 4 :(得分:4)
在Windows任务栏上重新启动ASP.NET Cassini为我修复了这个问题!
答案 5 :(得分:4)
重新启动Visual Studio为我解决了这个问题。我在页面加载期间停止了调试器。
答案 6 :(得分:1)
我今天早上大致每隔一段时间就开始收到此错误。重新启动开发LocalHost服务器开始变得非常繁琐,所以我开始挖掘。长话短说,有一对SqlConnection
/ SqlCommand
对从未处理过,重构该代码会停止异常。
答案 7 :(得分:0)
在本地运行IIS时我得到了同样的东西。似乎是由于在启动站点时停止调试器。运行'iisreset'修复它。