Невозможно вызвать метод или получить свойство из нулевого объекта. Объект, возвращаемый следующим стеком вызовов, является нулевым - PullRequest
0 голосов
/ 20 марта 2020

Я использую функции CSOM и azure для создания семейства сайтов. Мой рабочий процесс сначала использует GetAzureADAppOnlyAuthenticatedContext для получения admin-контекста клиента после создания сайта. Получите clientcontext семейства сайтов, а затем задайте свойство сайта, например добавьте пользователя в группу. , владелец сайта et c. Он хорошо работает при локальной отладке, но иногда получает ошибку ниже:

Cannot invoke method or retrieve property from null object. Object returned by the following call stack is null. \"AssociatedOwnerGroup\r\nRootWeb\r\nSite\r\nMicrosoft.SharePoint.SPContext.Current\r\n\""

и мой код выглядит так:

public ClientContext GetAzureADOnlyClientContext(string SiteUrl, string appId, string tenant, X509Certificate2 certificate,bool isadmin)
        {
            ClientContext newClientContext;
            try
            {
                newClientContext = new AuthenticationManager().GetAzureADAppOnlyAuthenticatedContext(SiteUrl, appId, tenant, certificate);
                if (!isadmin)
                {
                    Web web = newClientContext.Web;
                    newClientContext.Load(web, w => w.Url);
                }
                newClientContext.ExecuteQuery();
                return newClientContext;
            }
            catch (Exception ex)
            {
                newClientContext = null;
                if (_logHelper != null)
                {
                    _logHelper.writeLog("GetAzureADContextError:"+ex.Message, TraceLevel.Error, ex);
                }
                return null;
            }
        }

в основной функции

 while (ctxNew == null && count <= Constants.NEWSITE_TRYCOUNT)
                    {
                        logHelper.writeLog(string.Format("Site is being provisioned, waiting for {0} seconds ({1})", Constants.NEWSITE_SLEEP_SECONDS, count));
                        Thread.Sleep((int)Constants.NEWSITE_SLEEP_SECONDS * 2000);
                        //ctxNew = spHelper.GetClientContextByCredential(cred, true);
                        ctxNew = spHelper.GetAzureADOnlyClientContext(hostUrl, spAzureAppId, spTenant, certificate,false);

                        count++;
                    }

                    if (ctxNew == null)
                    {
                        logHelper.writeLog("New site collection could not be retrieved from " + hostUrl);
                    }
                    else
                    {
                        logHelper.writeLog("New site collection is created.");
                        Thread.Sleep((int)Constants.NEWSITE_SLEEP_SECONDS * 1000);
                        processRequestHelper = new ProcessRequestHelper(admClientContext, ctxNew, tenant, siteCreationInfo, log);
                        processRequestHelper.UpdateSite();
                        logHelper.writeLog(hostUrl + " has been updated.");
                    }



public void UpdateSite()
        {
            _logHelper.writeLog("Updating " + _newClientContext.Url);

            string description = _siteProperties.Description;
            string[] siteOwners = _siteProperties.BusinessOwnerEmail.Split(';');
            string[] members = _siteProperties.MemberEmails.ToArray();

            _tenant.SetSiteAdmin(_newClientContext.Url, _siteProperties.TechnicalOwnerEmail, true);
            _adminClientContext.ExecuteQuery();

            if (siteOwners.Length > 0)
            {
                AddGroupUser(_newClientContext.Site.RootWeb.AssociatedOwnerGroup, siteOwners);
            }

            if (members.Length > 0)
            {
                AddGroupUser(_newClientContext.Site.RootWeb.AssociatedMemberGroup, members);
            }

            if (!string.IsNullOrWhiteSpace(description))
            {
                _newClientContext.Site.RootWeb.Description = description;
                _newClientContext.Site.RootWeb.Update();
            }

            try
            {
                if (_newClientContext.HasPendingRequest)
                {
                    _newClientContext.ExecuteQuery();
                }

                _logHelper.writeLog("Site updated!");
            }
            catch (Exception ex)
            {
                _logHelper.writeLog("Update site error:"+ex.Message, TraceLevel.Error, ex);
                throw;
            }
        }

 private void AddGroupUser(Group grp, string[] usernameArr)
        {
            foreach (string username in usernameArr)
            {
                try
                {
                    _logHelper.writeLog("Add User " + username + " to group.");
                    User user = _newClientContext.Web.EnsureUser(username);
                    _newClientContext.Load(user);
                    grp.Users.AddUser(user);
                    _newClientContext.ExecuteQuery();
                }
                catch (Exception ex)
                {
                    _logHelper.writeLog("Add User " + username + ": " + ex.Message, TraceLevel.Error, ex);
                }
            }
        }

Это кажется, что иногда clientconetxt обнуляется в azure funtion

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...