【问题标题】:SemaphoreFullException when checking user role via ASP.NET membership通过 ASP.NET 成员资格检查用户角色时出现 SemaphoreFullException
【发布时间】:2011-10-16 03:22:49
【问题描述】:

我有一个页面,它在执行某些任务之前检查用户是否处于特定角色,并且功能没有问题,并且没有对相关代码进行明显的相关更改。该站点位于运行 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(字符串用户名)+847 System.Web.Security.RolePrincipal.IsInRole(字符串角色) +182

【问题讨论】:

    标签: asp.net exception membership semaphore


    【解决方案1】:

    我也偶尔会收到。

    我相信在我的情况下,它的发生是因为我在页面执行期间停止了调试器,所以数据库连接池可能搞砸了。

    这里有一个很长的讨论帖: http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/b5b7a179-3737-4380-b6cf-843f3e71b317/

    不同的用户报告同样的事情。 没有明确的结论,微软似乎觉得我们的应用程序正在关闭一个它们不应该关闭的句柄。但在我们的应用中至少没有 CloseHandle 调用。

    如果它是数据库连接池中的一个真正的错误,我会认为它会在很久以前被发现,因为这是运行每个 asp.net 网站的东西......

    【讨论】:

    • 我相信在我的情况下,这可能是因为我在页面执行期间停止了调试器,所以可能是数据库连接池搞砸了。
    【解决方案2】:

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

    【讨论】:

    • 另外,我也重启了IIS。
    • 我尝试在服务器上回收应用程序池,但并没有清除它。但重新启动 Visual Studio(如您所建议的)确实如此。
    【解决方案3】:

    今天早上,我几乎每隔一次构建就开始出现此错误。重新启动开发 LocalHost 服务器开始变得非常乏味,所以我开始挖掘。长话短说,有一对 SqlConnection/SqlCommand 从未被处理掉,重构该代码停止了异常。

    【讨论】:

      【解决方案4】:

      我知道它已发布,但这是我得到它的方法,以及解决它的方法。

      我做了什么 在进行 SQL 调用的代码段附近放置一个断点。

      解决了什么问题 在 Windows 系统托盘中重新启动 ASP.NET 开发服务器(在右下角的时钟旁边)

      【讨论】:

        【解决方案5】:

        在本地 IIS 上运行时,我得到了同样的结果。似乎是由于在启动站点时停止了调试器。运行 'iisreset' 修复它。

        【讨论】:

          【解决方案6】:

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

          或者通过添加 'Pooling=False;' 永久到连接字符串应该可以解决问题。

          【讨论】:

          • 禁用池具有巨大的性能影响。这个答案提出了非常糟糕的建议。
          • 谢谢。我同意缺乏表现,但表现不是问题。这是关于修复错误/问题,顺便说一句,从无法运行应用程序到花费几毫秒连接是性能的一个很大的提升。如果需要使用该选项,我建议调查根本原因并删除 pooling=false 。 forums.asp.net/t/1710783.aspx
          【解决方案7】:

          在 Windows 任务栏上重新启动 ASP.NET Cassini 为我解决了这个问题!

          【讨论】:

            【解决方案8】:

            当我在进行 SQL 调用的行上插入断点时发生这种情况。

            将断点放在稍后的点(而不是在 SQL 调用处)为我解决了这个问题。

            【讨论】:

            • 怎么样?我不知道为什么,但这正是我在看到这个错误之前所做的。我通过关闭系统托盘中的 ASP.NET 开发服务器 - 端口 #### 来解决它。
            猜你喜欢
            • 2013-03-31
            • 2011-02-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-18
            • 1970-01-01
            相关资源
            最近更新 更多