MOSS ad组的获取及Hashtable作缓存总结
问题一:
在MOSS项目中,通过web.SiteGroups[i].ContainsCurrentUser可以判断到当前登录的用户是否是AD域中的用户
即使当前用户在MOSS站点中并不存在。
而且通过web.AllUsers或web.SiteUserInfoList都可以判断到AD域中的用户。
但是,如果使用web.SiteGroups[i].Users["域用户帐号"] 时,却会报错。这个时候该怎么弄呢?
我的解决方案是通过模拟用户来操作,代码如下:
如上可以获取无论是AD域中的用户还是MOSS站点的用户所属的所有组。。
另一个Hashtable缓存,在不方便使用System.Web.Caching.Cache或HttpRuntime.Cache,或HttpContext.Current.Cache的时候,可以试试,代码如下:
在MOSS项目中,通过web.SiteGroups[i].ContainsCurrentUser可以判断到当前登录的用户是否是AD域中的用户
即使当前用户在MOSS站点中并不存在。
而且通过web.AllUsers或web.SiteUserInfoList都可以判断到AD域中的用户。
但是,如果使用web.SiteGroups[i].Users["域用户帐号"] 时,却会报错。这个时候该怎么弄呢?
我的解决方案是通过模拟用户来操作,代码如下:
 1 /// <summary>
 /// <summary>
2 /// 获取用户所属于的组
        /// 获取用户所属于的组
3 /// </summary>
        /// </summary>
4 /// <param name="user"></param>
        /// <param name="user"></param>
5 /// <returns></returns>
        /// <returns></returns>
6 private IList<SPGroup> GetUserExistInGroups(SPUser user)
        private IList<SPGroup> GetUserExistInGroups(SPUser user)
7 {
        {
8 try
            try
9 {
            {
10 IList<SPGroup> tempGroups = new List<SPGroup>();
                IList<SPGroup> tempGroups = new List<SPGroup>();
11
12 SPSecurity.RunWithElevatedPrivileges(delegate()
                SPSecurity.RunWithElevatedPrivileges(delegate()
13 {
                {
14 SPUser tempUser = web.AllUsers[user.LoginName];
                    SPUser tempUser = web.AllUsers[user.LoginName];
15 using (SPSite tempSite = new SPSite(site.Url, tempUser.UserToken))
                    using (SPSite tempSite = new SPSite(site.Url, tempUser.UserToken))
16 {
                    {
17 using (SPWeb tempWeb = tempSite.OpenWeb())
                        using (SPWeb tempWeb = tempSite.OpenWeb())
18 {
                        {
19 SPGroupCollection groups = tempWeb.SiteGroups;
                            SPGroupCollection groups = tempWeb.SiteGroups;
20 foreach (SPGroup group in groups)
                            foreach (SPGroup group in groups)
21 {
                            {
22 if (group.ContainsCurrentUser)
                                if (group.ContainsCurrentUser)
23 {
                                {
24 tempGroups.Add(group);
                                    tempGroups.Add(group);
25 }
                                }
26 }
                            }
27
28 }
                        }
29 }
                    }
30 });
                });
31 return tempGroups;
                return tempGroups;
32 }
            }
33 catch
            catch
34 {
            {
35 return null;
                return null;
36 }
            }
37 }
        }
 /// <summary>
 /// <summary>2
 /// 获取用户所属于的组
        /// 获取用户所属于的组3
 /// </summary>
        /// </summary>4
 /// <param name="user"></param>
        /// <param name="user"></param>5
 /// <returns></returns>
        /// <returns></returns>6
 private IList<SPGroup> GetUserExistInGroups(SPUser user)
        private IList<SPGroup> GetUserExistInGroups(SPUser user)7
 {
        {8
 try
            try9
 {
            {10
 IList<SPGroup> tempGroups = new List<SPGroup>();
                IList<SPGroup> tempGroups = new List<SPGroup>();11

12
 SPSecurity.RunWithElevatedPrivileges(delegate()
                SPSecurity.RunWithElevatedPrivileges(delegate()13
 {
                {14
 SPUser tempUser = web.AllUsers[user.LoginName];
                    SPUser tempUser = web.AllUsers[user.LoginName];15
 using (SPSite tempSite = new SPSite(site.Url, tempUser.UserToken))
                    using (SPSite tempSite = new SPSite(site.Url, tempUser.UserToken))16
 {
                    {17
 using (SPWeb tempWeb = tempSite.OpenWeb())
                        using (SPWeb tempWeb = tempSite.OpenWeb())18
 {
                        {19
 SPGroupCollection groups = tempWeb.SiteGroups;
                            SPGroupCollection groups = tempWeb.SiteGroups;20
 foreach (SPGroup group in groups)
                            foreach (SPGroup group in groups)21
 {
                            {22
 if (group.ContainsCurrentUser)
                                if (group.ContainsCurrentUser)23
 {
                                {24
 tempGroups.Add(group);
                                    tempGroups.Add(group);25
 }
                                }26
 }
                            }27

28
 }
                        }29
 }
                    }30
 });
                });31
 return tempGroups;
                return tempGroups;32
 }
            }33
 catch
            catch34
 {
            {35
 return null;
                return null;36
 }
            }37
 }
        }如上可以获取无论是AD域中的用户还是MOSS站点的用户所属的所有组。。
另一个Hashtable缓存,在不方便使用System.Web.Caching.Cache或HttpRuntime.Cache,或HttpContext.Current.Cache的时候,可以试试,代码如下:
 1 /// <summary>
/// <summary>
2 /// 哈希表缓存
    /// 哈希表缓存
3 /// 作者:徐志泽
    /// 作者:徐志泽
4 /// 创建日期:2008-12-26
    /// 创建日期:2008-12-26
5 /// </summary>
    /// </summary>
6 public class HashCacheTool
    public class HashCacheTool
7 {
    {
8 private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
        private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
9
10 /// <summary>
        /// <summary>
11 /// 保存缓存值
        /// 保存缓存值
12 /// </summary>
        /// </summary>
13 /// <param name="cacheKey"></param>
        /// <param name="cacheKey"></param>
14 /// <param name="cmdParms"></param>
        /// <param name="cmdParms"></param>
15 public static void SetCache(string cacheKey, object cacheValue)
        public static void SetCache(string cacheKey, object cacheValue)
16 {
        {
17 parmCache[cacheKey] = cacheValue;
            parmCache[cacheKey] = cacheValue;
18 }
        }
19 /// <summary>
        /// <summary>
20 /// 获取缓存值
        /// 获取缓存值 
21 /// </summary>
        /// </summary>
22 /// <param name="cacheKey"></param>
        /// <param name="cacheKey"></param>
23 /// <returns></returns>
        /// <returns></returns>
24 public static object GetCached(string cacheKey)
        public static object GetCached(string cacheKey)
25 {
        {
26 return parmCache[cacheKey];
            return parmCache[cacheKey];
27 }
        }
28 /// <summary>
        /// <summary>
29 /// 清空所有
        /// 清空所有
30 /// </summary>
        /// </summary>
31 public static void Clear()
        public static void Clear()
32 {
        {
33 if (parmCache.Count <= 0)
            if (parmCache.Count <= 0)
34 return;
                return;
35 parmCache.Clear();
            parmCache.Clear();
36 }
        }
37 /// <summary>
        /// <summary>
38 /// 判断关键字是否存在
        /// 判断关键字是否存在
39 /// </summary>
        /// </summary>
40 /// <param name="key"></param>
        /// <param name="key"></param>
41 /// <returns></returns>
        /// <returns></returns>
42 public static bool IsKeyExist(string cacheKey)
        public static bool IsKeyExist(string cacheKey)
43 {
        {
44 if (parmCache.Count <= 0)
            if (parmCache.Count <= 0)
45 return false;
                return false;
46 return parmCache.ContainsKey(cacheKey);
            return parmCache.ContainsKey(cacheKey);
47 }
        }
48 /// <summary>
        /// <summary>
49 /// 如果关键字不存在的话,则清空所有
        /// 如果关键字不存在的话,则清空所有
50 /// </summary>
        /// </summary>
51 /// <param name="key"></param>
        /// <param name="key"></param>
52 public static void ClearWhileKeyNotExist(string cacheKey)
        public static void ClearWhileKeyNotExist(string cacheKey)
53 {
        {
54 if (parmCache.Count <= 0)
            if (parmCache.Count <= 0)
55 return;
                return;
56 if (IsKeyExist(cacheKey))
            if (IsKeyExist(cacheKey))
57 return;
                return;
58 else
            else
59 Clear();
                Clear();
60 }
        }
61 }
    }
其中的
private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
是同步封装。
我就曾因为同步问题,导致在Loadrunner中多并发测试时,几乎90%的用户会报500错误。
 /// <summary>
/// <summary>2
 /// 哈希表缓存
    /// 哈希表缓存3
 /// 作者:徐志泽
    /// 作者:徐志泽4
 /// 创建日期:2008-12-26
    /// 创建日期:2008-12-265
 /// </summary>
    /// </summary>6
 public class HashCacheTool
    public class HashCacheTool7
 {
    {8
 private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
        private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());9

10
 /// <summary>
        /// <summary>11
 /// 保存缓存值
        /// 保存缓存值12
 /// </summary>
        /// </summary>13
 /// <param name="cacheKey"></param>
        /// <param name="cacheKey"></param>14
 /// <param name="cmdParms"></param>
        /// <param name="cmdParms"></param>15
 public static void SetCache(string cacheKey, object cacheValue)
        public static void SetCache(string cacheKey, object cacheValue)16
 {
        {17
 parmCache[cacheKey] = cacheValue;
            parmCache[cacheKey] = cacheValue;18
 }
        }19
 /// <summary>
        /// <summary>20
 /// 获取缓存值
        /// 获取缓存值 21
 /// </summary>
        /// </summary>22
 /// <param name="cacheKey"></param>
        /// <param name="cacheKey"></param>23
 /// <returns></returns>
        /// <returns></returns>24
 public static object GetCached(string cacheKey)
        public static object GetCached(string cacheKey)25
 {
        {26
 return parmCache[cacheKey];
            return parmCache[cacheKey];27
 }
        }28
 /// <summary>
        /// <summary>29
 /// 清空所有
        /// 清空所有30
 /// </summary>
        /// </summary>31
 public static void Clear()
        public static void Clear()32
 {
        {33
 if (parmCache.Count <= 0)
            if (parmCache.Count <= 0)34
 return;
                return;35
 parmCache.Clear();
            parmCache.Clear();36
 }
        }37
 /// <summary>
        /// <summary>38
 /// 判断关键字是否存在
        /// 判断关键字是否存在39
 /// </summary>
        /// </summary>40
 /// <param name="key"></param>
        /// <param name="key"></param>41
 /// <returns></returns>
        /// <returns></returns>42
 public static bool IsKeyExist(string cacheKey)
        public static bool IsKeyExist(string cacheKey)43
 {
        {44
 if (parmCache.Count <= 0)
            if (parmCache.Count <= 0)45
 return false;
                return false;46
 return parmCache.ContainsKey(cacheKey);
            return parmCache.ContainsKey(cacheKey);47
 }
        }48
 /// <summary>
        /// <summary>49
 /// 如果关键字不存在的话,则清空所有
        /// 如果关键字不存在的话,则清空所有50
 /// </summary>
        /// </summary>51
 /// <param name="key"></param>
        /// <param name="key"></param>52
 public static void ClearWhileKeyNotExist(string cacheKey)
        public static void ClearWhileKeyNotExist(string cacheKey)53
 {
        {54
 if (parmCache.Count <= 0)
            if (parmCache.Count <= 0)55
 return;
                return;56
 if (IsKeyExist(cacheKey))
            if (IsKeyExist(cacheKey))57
 return;
                return;58
 else
            else59
 Clear();
                Clear();60
 }
        }61
 }
    }其中的
private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
是同步封装。
我就曾因为同步问题,导致在Loadrunner中多并发测试时,几乎90%的用户会报500错误。
    <h3>
心静似高山流水不动,心清若巫峰雾气不沾。
</h3>
心静似高山流水不动,心清若巫峰雾气不沾。
</h3>
 
                    
                


 
             
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号