SharePoint 365控制台应用CSOM报错:XmlException根元素缺失
我帮你分析下这个问题,你遇到的两个异常其实是连锁反应,根源出在代码里凭据设置时机错误和ExecuteQuery调用顺序不对,咱们一步步来修复:
问题原因拆解
- 未提前设置凭据导致请求失败:你在创建
ClientContext后,直接就去获取列表、创建列表项了,但这时候clientContext.Credentials还没赋值。SharePoint Online会拒绝未认证的请求,返回的不是合法的XML响应,后续解析时就会抛出“Root element is missing”的System.Xml.XmlException。 - ServerVersion未初始化:因为前面的请求失败了,
clientContext.ServerVersion这个属性根本没机会从SharePoint的响应中加载,所以访问它时会抛出PropertyOrFieldNotInitializedException。
修正后的代码
string login = "username@web365.onmicrosoft.com"; string password = "pooo%yup12"; var securePassword = new SecureString(); foreach (char c in password) { securePassword.AppendChar(c); } string siteUrl = "https://web365.onmicrosoft.com/sites/test"; // 1. 先创建上下文,立刻设置凭据(关键修正点) ClientContext clientContext = new ClientContext(siteUrl); var onlineCredentials = new SharePointOnlineCredentials(login, securePassword); clientContext.Credentials = onlineCredentials; // 2. 再执行列表项操作 List newlist = clientContext.Web.Lists.GetByTitle("Test"); ListItemCreationInformation itemInfo = new ListItemCreationInformation(); ListItem newItem = newlist.AddItem(itemInfo); newItem["Title"] = "2"; newItem.Update(); // 3. 提交变更(如果需要加载Web属性,可以合并在这里) clientContext.Load(clientContext.Web, w => w.Title); // 如果不需要Web标题可以删掉这行 clientContext.ExecuteQuery();
关键修改说明
- 凭据提前设置:所有SharePoint对象操作(获取列表、创建项等)必须在
clientContext.Credentials赋值之后执行,确保请求能被正常认证。 - ExecuteQuery的正确位置:创建并更新列表项后,必须调用
ExecuteQuery()来把变更提交到SharePoint服务器;加载Web属性的操作可以和这个提交操作合并,减少一次网络请求。 - 避免冗余操作:如果你的业务不需要获取Web的Title属性,直接删掉
clientContext.Load(clientContext.Web, w => w.Title);这行,避免不必要的资源消耗。
按照这个修正后的代码运行,应该就能解决你遇到的两个异常了。
内容的提问来源于stack exchange,提问作者Cally
相关产品推荐
相关产品推荐

