文章出處

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。

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()