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。

SharePoint Client Object Model API 介绍以及工作原理解析的更多相关文章

  1. c# sharepoint client object model 客户端如何创建中英文站点

    c# sharepoint client object model 客户端如何创建中英文站点 ClientContext ClientValidate = tools.GetContext(Onlin ...

  2. SharePoint 2010 匿名用户调用Client Object Model访问列表项

    最近有个小需求,在门户首页上加个通知公告的版块,新闻来源是列表项,需要有垂直滚动的效果. 第一个想法就是通过SharePoint的Client Object Model获取列表数据再加上JQuery来 ...

  3. 关于SharePoint 的Client object model该何时load和execut query的一点自己的看法

    很多人在用client object model的时候,不知道何时或者该不该load,今天看到一个观点描述这个问题,觉得很有道理,和大家分享.那就是写client object model就像写sql ...

  4. 解决在使用client object model的时候报“object does not belong to a list”错误

    在查看别人代码的时候,发现了个有意思的问题,使用client object model将一个文件check in 我使用的是如下语句获取file Microsoft.SharePoint.Client ...

  5. Docker Macvlan 介绍 or 工作原理

    Docker Macvlan Network Macvlan Network:属于Docker的网络驱动. Macvlan Network:Docker主机网卡接口逻辑上分为多个子接口,每个子接口标识 ...

  6. jdk线程池ThreadPoolExecutor工作原理解析(自己动手实现线程池)(一)

    jdk线程池ThreadPoolExecutor工作原理解析(自己动手实现线程池)(一) 线程池介绍 在日常开发中经常会遇到需要使用其它线程将大量任务异步处理的场景(异步化以及提升系统的吞吐量),而在 ...

  7. 在C#开发中如何使用Client Object Model客户端代码获得SharePoint 网站、列表的权限情况

    自从人类学会了使用火,烤制的方式替代了人类的消化系统部分功能,从此人类的消化系统更加简单,加速了人脑的进化:自从SharePoint 2010开始有了Client Side Object Model ...

  8. 记一个使用Client Object Model上传文件的小例子

    1. 新建一个C#的Console project. 2. 给project 添加reference: Microsoft.SharePoint.Client Microsoft.SharePoint ...

  9. Docker Swarm 介绍 or 工作原理

    Docker Swarm 介绍 Swarm 简介 Swarm是Docker公司自研发的容器集群管理系统,Swarm在早期是作为一个独立服务存在,在Docker Engine v1.12中集成了Swar ...

随机推荐

  1. socket编程相关的结构体和字节序转换、IP、PORT转换函数

    注意:结构体之间不能直接进行强制转换, 必须先转换成指针类型才可以进行结构体间的类型转换, 这里需要明确的定义就是什么才叫强制转换. 强制转换是将内存中一段代码以另一种不同类型的方式进行解读, 因此转 ...

  2. nullcon HackIM2016 -- Programming Question 3

    Still Hungry and unsutisfied, you are looking for more. Some more, unique un heard dishes. Then you ...

  3. 一款好用的杀毒软件-pchunter64

    360真是猛,用system权限运行了一坨后台进程.今天清理系统盘想删掉360发现根本没权限.进程又杀不掉. 最后使用 pchuter64 强行干掉了360 避免了 重装系统的尴尬.360作为世界第一 ...

  4. C# 关于时间

    1.2016/7/8 00:10:10 转换成 2016-07-08T 00:10:10 在用VB动态调用WevService的时候,传入的时间格式为2016/7/8 00:10:10,导致调用出错, ...

  5. eclipse的ssh框架详解

    1.创建项目 2.导包 1.1:导入Struts2可能用到的包: 先从网站下载 再这里找出,打开它把WEB-INF/lib/下的所有包导入项目   1.2:导入spring可能用到的包: 先从网站下载 ...

  6. map,list

    ---恢复内容开始--- Map<String, List> map=new HashMap<String,List>() HashMap可以理解成是一对对数据的集合我暂时把L ...

  7. Linux下守护进程初探

    守护进程一直后台运行,与终端脱离,一般负责周期性地执行系统任务,服务器应用一般以守护进程进行运行.实现一个守护进程主要分为5部: 1.脱离父进程 2.setsid(可以选择再次fork) 3.umas ...

  8. windows防火墙打不开的处理办法

    一.防火墙配置出错 开始-->运行-->gpedit.msc 这时,打开了组策略 在左面分级展开 计算机配置-->管理模板-->网络-->网络连接-->Window ...

  9. UWP深入学习四:动画及图像

    Storyboarded animations Key-frame animations and easing function animations 缓动函数 缓动函数支持你将自定义数学公式应用到动 ...

  10. 状态伪类选择器(E::selection)

    E::selection选择器:  E::selection{background:#FF6600;  color:#fff;}     //当文字被选中时,背景是红色,文字是白色 E::-moz-s ...