zoukankan      html  css  js  c++  java
  • BreakRoleInheritance在多线程情况下调用的问题

    SPWeb, SPList, SPListItem对象都有这个方法. BreakRoleInheritance这个方法涉及到SharePoint内部的权限的复杂实现和调用, 这个方法在单线程的情况下工作良好, 但是在多线程的场景下(比如Event Handler中调用这个方法)会出现一些奇怪的问题. 主要的特征就是Event View中会看到ID 为6875的错误.

    每个6875错误的详细信息会有些许不同.

    根本原因可能是因为在BreakRoleInheritance方法中, 有一句对使得SPWeb无效的内部调用. SPWeb实际上并不是一个纯的C#对象, 它占有的资源需要被明确释放, 可能这个对象在BreakRoleInheritance的多线程调用下的控制并没实现的很好.

    如果要避免这样的问题发生, 我们需要使用C#的lock语句来在这个方法的调用上套上critical section, 来进行线程同步的控制. 代码样例如下:

    public class TestHandler: SPItemEventReceiver
    {
        static object oDummy = new object();
    
        public override void ItemUpdated(SPItemEventProperties properties)
        {
            try
            {
                lock (oDummy)
                {
                    SPSecurity.RunWithElevatedPrivileges(delegate()
                    {
                        using (SPSite site = new SPSite(properties.WebUrl))
                        {
                            using (SPWeb web = site.OpenWeb())
                            {
                                //Other code lines
                                //...........
                                web.BreakRoleInheritance(false);
    
                                //Other code lines 
                            }
                        }
                    }); 
                }
            }
            catch (Exception ex)
            {
                throw ex.Message;
            }
        }
    }

    参考资料:

    BreakRoleInheritance and AllowUnsafeUpdates

    http://www.wictorwilen.se/Post/BreakRoleInheritance-and-AllowUnsafeUpdates.aspx

  • 相关阅读:
    CentOS7 Install Consul
    CentOS6 Install kafka
    CentOS7 Install Shipyard
    zabbix_sender
    python mail
    CentOS6.8 RPM包安装快速zabbix22
    python与shell通过微信企业号发送消息
    zabbix监控之grafana
    linux查看进程(java)启动时间
    (ubuntu)安装配置jenkins(新版)
  • 原文地址:https://www.cnblogs.com/awpatp/p/1745760.html
Copyright © 2011-2022 走看看