我遇到一个问题,偶尔我们的网络服务会出错。它在一个函数中向字典添加一个重复键,该函数在本地摘要认证方案中从数据库获取用户标识。该函数非常简单,并且密钥是硬编码的,这些密钥会被添加,而新的密钥会出现在前面的字典中。所以真正唯一的方法就是多个线程一次运行该函数。这是一个静态函数,所以我确定这是正在发生的事情。堆栈跟踪看起来像这样。
system.collections.hashtable.insert(Object key, Object nValue, Boolean add)
system.collections.specialized.NameobjectCollectionbase.baseAdd(String name, object value)
SecMan.Getuser(String Username)
Sec.AuthenticationModule.OnAuthenticateRequest(Object source,EventArgs eventArgs)
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
它只是发生在一台服务器上,其他人都很好。
我是一个winforms人,对iis不太了解。我的SecMan.DLL中的代码是否像我怀疑的那样异步执行?总是这样吗?如果是这样的话,似乎在其他网站上会出现问题。在推出某种修复之前,我想确定一个明确的原因,因为这是一个很大的麻烦。
谢谢,
答案 0 :(得分:2)
是的,网络应用(包括网络服务)是异步的。如果SecMan是单例,并且您在多个Web请求中共享它,则需要使其成为线程安全的。