ClientContext.ExecuteQuery
大多数csom命令都是把请求任务放到请求队列里久返回了,没等到实际执行完成,所有请求都有可能失败
ClientContext.ExecuteQuery 方法的作用是将客户端对象模型 (CSOM) 中的所有挂起的请求发送到服务器,并等待服务器对这些请求进行处理。这是确保在使用 CSOM 与 SharePoint 进行交互时,所有的操作都已经被处理并且得到了响应的重要方法。
注意,即使使用这个方法,也可能会有请求失败,如果对完整性有要求,要么保持强一致性立即验证,要么追求最终一致性用一个队列保存可能失败的请求事后校验
Site
建立连接
ClientContext tempContext = new ClientContext(https://m365x58472227.sharepoint.com/sites/sitename);
tempContext.Credentials = new SharePointOnlineCredentials(365用户名(邮箱), 365密码); //用户凭证可复用
获取subSite
public static Web GetSubsite(ClientContext context, String subsiterelativeurl)
{
// /sites/siteName/subSiteName
Web oWeb = context.Site.OpenWeb(subsiterelativeurl);
context.Load(oWeb);
context.Load(oWeb.AllProperties);
context.ExecuteQuery();
return oWeb;
}
新增/修改元数据
- 获取编辑site元数据权限
SetDenyAddAndCustomizePages
adminContext = SharePointUtil.GetContext("https://m365x7227-admin.sharepoint.com/",username, password);
SharePointUtil.SetDenyAddAndCustomizePages(adminContext, "https://m365x522.sharepoint.com/sites/" + siteName);
siteContext = SharePointUtil.GetContext("https://m365x58.sharepoint.com/sites/", username, password);
- 新增、修改
private void DoAdd_Click(object sender, EventArgs e)
{
//site、subsite、list、lib等的属性集(元数据)
var dic = lib.RootFolder?Properties ?? siteContext?Web.AllProperties;
//准备好对应类型的值
Object value = ConvertValueToObjectType(typeString,Value);
if (folder == null)
{
SharePointUtil.AddProperty(siteContext, site.web, site.web.AllProperties, dic, tempKey, value);
}
else
{
SharePointUtil.AddProperty(siteContext, list.RootFolder, list.RootFolder.Properties, dic, tempKey, value);
}
}
public static void AddProperty(ClientContext context,dynamic clientObject, dynamic properties, PropertyValues dic, String key,Object value )
{
AlterProperty(context,clientObject,properties,dic,key,value);
}
public static void AlterProperty(ClientContext context, dynamic clientObject, dynamic properties, PropertyValues dic, String key, Object value)
{
dic[key] = value;
clientObject.Update();
clientObject.RefreshLoad();
context.ExecuteQuery();
}
删除元数据
- 获取编辑site元数据权限
SetDenyAddAndCustomizePages
adminContext = SharePointUtil.GetContext("https://m365x58-admin.sharepoint.com/",username, password);
SharePointUtil.SetDenyAddAndCustomizePages(adminContext, "https://m365x584.sharepoint.com/sites/" + siteName);
siteContext = SharePointUtil.GetContext("https://m365x584.sharepoint.com/sites/", username, password);
2.删除
private void DoDelete_Click(object sender, EventArgs e)
{
PropertyValues dic = folder?.Properties ?? web?.AllProperties;
if (folder == null)
{
SharePointUtil.DeleteProperty(siteContext, site.web, site.web.AllProperties, dic, tempKey);
}
else
{
SharePointUtil.DeleteProperty(siteContext, lib.rootfolder, lib.rootfolder.Properties, dic, tempKey);
}
}
public static void DeleteProperty(ClientContext context, dynamic clientObject,PropertyValues properties, PropertyValues dic, String key)
{
dic[key] = null;
dic.FieldValues.Remove(key);
clientObject.Update();
clientObject.RefreshLoad();
context.ExecuteQuery();
}
新增字段(列)
public static void AddField(ClientContext context,String objectTitle)
{
// 检查文档库是否存在,libraryPath是lib的名称,不是路径名
List list = context.Web.Lists.GetByTitle(objectTitle);
//如果不存在会抛出异常
context.Load(list);
String xmlString = "<Field DisplayName='Date Time Column' Type='DateTime' Format='DateTime' />";
context.ExecuteQuery();
Field field=list.Fields.AddFieldAsXml(xmlString,true,AddFieldOptions.DefaultValue);
context.Load(field);
// 提交更改到服务器
context.ExecuteQuery();
}
集合
取site下的各类集合
// 检查文档库是否存在,libraryPath是lib的名称,不是路径名
library = context.Web.Lists.GetByTitle(libraryPath);
context.Load(library);
//如果不存在会抛出异常
context.ExecuteQuery();
site下新建各类集合
以lib为例
ListCreationInformation libraryInfo = new ListCreationInformation
{
//title是name
Title = libraryPath.Split().Last(),
//指定要创建的类型
TemplateType = (int)ListTemplateType.DocumentLibrary
};
library = context.Web.Lists.Add(libraryInfo);
context.ExecuteQuery();
新增/更新/删除元数据
参考site的
文件夹
获取folder
// 这里的folderurl格式要求很严格,一定是去掉site路径和/,如libname/foldername
var folder = context.Web.GetFolderByServerRelativeUrl(folderUrl);
context.Load(folder);
//没有会抛出异常
context.ExecuteQuery();
新建folder
//lib 也是folder的子类
currentFolder = folder.Folders.Add(foldername);
context.ExecuteQuery();
新增字段(列)
public static void AddField(ClientContext context,String objectTitle)
{
// 检查文档库是否存在,libraryPath是lib的名称,不是路径名
List list = context.Web.Lists.GetByTitle(objectTitle);
//如果不存在会抛出异常
context.Load(list);
String xmlString = "<Field DisplayName='Date Time Column' Type='DateTime' Format='DateTime' />";
context.ExecuteQuery();
Field field=list.Fields.AddFieldAsXml(xmlString,true,AddFieldOptions.DefaultValue);
context.Load(field);
// 提交更改到服务器
context.ExecuteQuery();
}
文件
上传文件
FileCreationInformation newFile = new FileCreationInformation
{
ContentStream = fileStream,
// /sites/sitename/libname/fildername/filename
Url = folder.ServerRelativeUrl + "/" + UUIDUtil.GetUUID() + file.SpFileName,
Overwrite = true
};
//上传文件
Microsoft.SharePoint.Client.File uploadFile = folder.Files.Add(newFile);
context.Load(uploadFile);
//设定修改时间
uploadFile.ListItemAllFields["Created"] = file.SpFileCreateTime;
context.ExecuteQuery();
复制文件
// /sites/sitename/libname/fildername/filename
originFile.CopyTo(targetFilePath, true)
修改文件信息(同时会修改版本)
Microsoft.SharePoint.Client.File uploadFile = GetFile(-----);
uploadFile.ListItemAllFields["Created"] = createTime;
uploadFile.ListItemAllFields["Modified"] = createTime.AddMonths(1);
uploadFile.ListItemAllFields.Update();
context.ExecuteQuery()
获取文件
// /sites/sitename/libname/fildername/filename
Microsoft.SharePoint.Client.File file = context.Web.GetFileByServerRelativeUrl(fileUrl);
context.Load(file);
context.ExecuteQuery()
或
// /sites/sitename/libname/fildername/filename
Microsoft.SharePoint.Client.File uploadFile = spFolder.Files.GetByUrl(spFileUrl);
context.Load(uploadFile);
uploadFiles.Add(uploadFile);
context.ExecuteQuery();
用户
添加用户
public static void AddMenbersToSiteAsOwner(ClientContext context, List<String> userEmailList)
{
Group group = context.Web.AssociatedOwnerGroup;
context.Load(group);
for (int i = 0; i < userEmailList.Count; i++)
{
User user = context.Web.EnsureUser(userEmailList[i]);
group.Users.AddUser(user);
try {
context.ExecuteQuery();
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
}
其他
获取编辑网站集权限
public static void SetDenyAddAndCustomizePages(ClientContext context, string siteUrl)
{
Tenant tenant = new Tenant(context);
SiteProperties siteProperties = tenant.GetSitePropertiesByUrl(siteUrl, true);
siteProperties.DenyAddAndCustomizePages = DenyAddAndCustomizePagesStatus.Disabled;
siteProperties.Update();
context.ExecuteQuery();
}