CSOM文档

263 阅读3分钟

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;
}

新增/修改元数据

  1. 获取编辑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);
  1. 新增、修改
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();
}

删除元数据

  1. 获取编辑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();
}