• SharePoint Client Object Model API 介绍以及工作原理解析


    CSOM和ServerAPI 的对比

    SharePoint从2010开始引入了Client Object Model的API(后文中用CSOM来代替),从名字来看,我们可以简单的看出,该API是面向客户端的应用程序的。有这个这套API,使得所有SharePoint的终端用户 可以开发自己的应用程序来访问,修改SharePoint。下面的列表简述了CSOM和Server API的区别:

     

    COM

    Server

    运行端

    1. 可以在任何能够访问SharePoint的机器上运行
    2. 可以再浏览器上,.Net应用程序上,Silver light,JavaScript,Jscript运行

    运行在SharePoint的服务器端

    权限要求

    必须指定一个用户,以该用户的权限操作SharePoint

    运行Server代码本身有一定的权限要求,可以通过管理员身份来操作SharePoint数据

    支持功能

    较少,智能实现客户端常用的功能

    更强大,实现大部分SharePoint管理操作

    COM工作原理

    COM通过WCF来实现的,在SharePoint的服务器端寄宿在.../_vti_bin/client.svc,通过Web Binding来实现请求的批处理。处理的整个过程为:

    1. 把请求命令序列化成XML
    1. 通过HttpRequest的形式发送给服务器
    2. 服务器对于每一个命令,都会调用对于的Server 方法
    3. 服务器端将结果序列化成JSON格式返回给客户端
    4. CSOM将JSON转换成对于的Object给调用者

    由于Http本身是无状态的,COM不需要和服务器一直保持一个连接。CSOM同时也具有WebRequest具有的一系列特点。

    COM实例介绍

    本段简单的介绍一下COM的使用的基本方式,如果获取一个SiteCollection对象的Id:

            private static void Main(string[] args)
            {
                ServicePointManager.ServerCertificateValidationCallback = delegate
                {
                    return true;
                };
    
    
                using (ClientContext clientContext = new ClientContext("https://cnblogtest.sharepoint.com"))
                {
                    var pasword = new SecureString();
                    "abc123!@#".ToCharArray().ToList().ForEach(pasword.AppendChar);
    
                    clientContext.Credentials = new SharePointOnlineCredentials("test001@cnblogtest.onmicrosoft.com", pasword);//设置权限
    
                    var testsite = clientContext.Site;
                    clientContext.Load(testsite);//设置查询信息
    
                    //此处会出异常因为没有执行查询
                    //Console.WriteLine("Sitecollection info:" + testsite.Id);
    
                    clientContext.ExecuteQuery();//执行查询
    
                    //此处可以正常返回SiteId
                    Console.WriteLine("Sitecollection info:" + testsite.Id);
                }
    
            }
    

      

    下面我们简单看一下这段代码的请求:

    Http的头信息

    POST https://cnblogtest.sharepoint.com/_vti_bin/client.svc/ProcessQuery HTTP/1.1

    X-RequestDigest: 0x5EBACC6A87E51042B53355DCD0AC99A30F055126FC18752E5F2C9DFFAD327A37EB8818EE48677BF9434002DDA05E0F420106E17313DFF9F7A951D891A3021FE3,27 Sep 2014 10:41:29 -0000

    Content-Type: text/xml

    X-RequestForceAuthentication: true

    X-FORMS_BASED_AUTH_ACCEPTED: f

    Cookie: SPOIDCRL=77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48U1A+VHJ1ZSwwaC5mfG1lbWJlcnNoaXB8MTAwMzdmZmU4YjQ5Y2M3M0BsaXZlLmNvbSwwIy5mfG1lbWJlcnNoaXB8dGVzdDAwMUBjbmJsb2d0ZXN0Lm9ubWljcm9zb2Z0LmNvbSwxMzA1NjcyMDA4ODY4MTM0NTEsRmFsc2UsVDBJWUFlWVRiMEc0bHNuZVBIMTB4R3lvYVQyd3FIS3JMaTU0bXE0bXZNOGlKUXl0MlFFRjNTT29qWmI2Nk1iOVZjOUJjKzhPNkx3RG42UWtacGxzVGtHOUd5OHFiczhFUnYyK2NZQkJGeFlXWkNXSGxiV2wrUEdWc3FkeWJyOXZSYWFtQ3FLSkRrejVEYnZOYnFHTDcvRy9LWUF1RjV3LzNIK1RQbXFYaXJ2MUo4eWFEYzh3KzFyTmxRTG9objVma3NDWUdUNVVHcmdWNFNOd1UrTnRnQ2xUNEtqSE1yOHFSR0VnblJ0clp6MnU2VEVPMkZsRnFMSUtTY2hrSGdrU01OdzdTMzUzczdQMUY3MmhQVVErQ3pZQkU4VGVDTFovMy90VmZwdWdnOWkxS1dTenNEL0MwZ2ZIQnJRSExUS2RDVE9vYVo1VVlGYTZmczRVOFZmbmV3PT0saHR0cHM6Ly9jbmJsb2d0ZXN0LnNoYXJlcG9pbnQuY29tL192dGlfYmluL2lkY3JsLnN2Yy88L1NQPg==

    Host: cnblogtest.sharepoint.com

    Content-Length: 548

    Expect: 100-continue

    Accept-Encoding: gzip, deflate

    这里面一些关键点我们可以看到:

    1. 请求方式HttpPost
    2. X-RequestForceAuthentication,需要Server端强制验证

    Http请求内容

    这里面简单的解释一下:

    1. ObjectPathId=1 的对象为content.Current对象
    2. ObjectPathId=3的对象为content.Current.Site对象    
    3. 我们对ObjectPathId为3的对象,请求所有的属性,因此SelectAllProperties=true

    实际上,我们每一次在Client端创建一个对象的时候,都会分配一个对应ObjectPathId,这个Id是自增的。这个Id存储在Microsoft.SharePoint.Client.ObjectPath中,所有的Client API对象都从这个类中,继承ObjectPathId属性。

    Reponse信息:

    这个请求返回的Response的JSON内容如下:

    可以看到,JSON对象里面包含了我们要请求的Site对象的所有属性信息,CSOM在接收到Response的时候,用JSON对象组装成COM对象,我们就可以调用了。因此Console.Writeline会显示出Site的Id。

  • 相关阅读:
    html5 表單元素
    html5 表單輸入類型
    html5 服務器發送事件
    html5 web workers
    html5應用緩存
    html5 sessionStorage VS loaclStorage
    html5地理定位
    html5 画布和SVG的差别
    html5 SVG
    SQL-22 统计各个部门对应员工涨幅的次数总和,给出部门编码dept_no、部门名称dept_name以及次数sum
  • 原文地址:https://www.cnblogs.com/myprogram/p/3997096.html
Copyright © 2020-2023  润新知