我有一个WCF服务,它调用授权管理器(AzMan)API - 这是一个COM接口。我使用以下代码获取给定用户帐户的角色列表:
public string[] GetRoleNamesForUser(string appName, SecurityIdentifier userSID)
{
m_azManStore.UpdateCache(null);
IAzApplication app = GetApplication(appName);
List<string> userRoles = new List<string>();
if (userSID != null)
{
IAzClientContext context = app.InitializeClientContextFromStringSid(userSID.ToString(), 1, null);
object[] roles = (object[])context.GetRoles("");
foreach (string uRole in roles)
{
userRoles.Add(uRole);
}
Marshal.FinalReleaseComObject(context);
}
return userRoles.ToArray();
}
此代码大部分时间都可正常运行。但是,在进行负载测试(始终使用相同的userSID)时,此代码有时会为角色列表返回一个空数组。 AzMan是否有重负载的问题,或者我对AzMan COM对象或某些东西没有做正确的事情?
答案 0 :(得分:1)
使用AzMan COM对象时,必须使用Marshal.FinalReleaseCOMObject(object)
释放资源。如果不这样做,可能会发生内存泄漏。我不得不将AzMan商店包装在一个一次性类中,这样每次调用都会打开AzMan,使用它然后关闭它。结果是一个更慢但更稳定的应用程序。
请查看此SO question了解详情