C# 无法从null对象调用方法或检索属性。以下调用堆栈返回的对象为null
我正在使用CSOM和azure函数创建网站集。我的工作流是在创建网站后,首先使用GetAzureADAppOnlyAuthenticatedContext获取admin clientcontext。获取网站集clientcontext,然后设置网站属性,如将用户添加到组、网站所有者等。 在本地调试时,它运行良好,但有时会出现以下错误:C# 无法从null对象调用方法或检索属性。以下调用堆栈返回的对象为null,c#,azure-functions,sharepoint-online,csom,C#,Azure Functions,Sharepoint Online,Csom,我正在使用CSOM和azure函数创建网站集。我的工作流是在创建网站后,首先使用GetAzureADAppOnlyAuthenticatedContext获取admin clientcontext。获取网站集clientcontext,然后设置网站属性,如将用户添加到组、网站所有者等。 在本地调试时,它运行良好,但有时会出现以下错误: Cannot invoke method or retrieve property from null object. Object returned by th
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);
}
}
}
while(ctxNew==null&&count 0)
{
AddGroupUser(_newClientContext.Site.RootWeb.AssociatedOwnerGroup,siteOwners);
}
如果(members.Length>0)
{
AddGroupUser(_newClientContext.Site.RootWeb.AssociatedMemberGroup,成员);
}
如果(!string.IsNullOrWhiteSpace(说明))
{
_newClientContext.Site.RootWeb.Description=描述;
_newClientContext.Site.RootWeb.Update();
}
尝试
{
if(_newClientContext.HasPendingRequest)
{
_newClientContext.ExecuteQuery();
}
_logHelper.writeLog(“站点更新!”);
}
捕获(例外情况除外)
{
_logHelper.writeLog(“更新站点错误:+ex.Message,TraceLevel.error,ex”);
投掷;
}
}
私有void AddGroupUser(组grp,字符串[]usernameArr)
{
foreach(usernameArr中的字符串用户名)
{
尝试
{
_logHelper.writeLog(“将用户“+用户名+”添加到组。”);
User User=\u newClientContext.Web.EnsureUser(用户名);
_加载(用户);
grp.Users.AddUser(用户);
_newClientContext.ExecuteQuery();
}
捕获(例外情况除外)
{
_logHelper.writeLog(“添加用户”+用户名+:“+ex.Message,TraceLevel.Error,ex”);
}
}
}
有时,azure Function中的clientconetxt可能会变为null当我调用context.Site.RootWeb.AssociatedOwnerGroup.Users.AddUser(用户)时,AssociatedOwnerGroup似乎会返回null;context.ExecuteQuery();