博客地址:http://blog.csdn.net/FoxDave
近来阅读SharePoint 2013开发一书,带着与大家一起分享其中的内容。
部署场景:
本地部署(On-Premise Deployment)、O365部署(Office 365 Deployment)、托管部署(Hosted Deployment)和混合部署(Hybrid Deployment)。
包场景:
完全信任的场解决方案(Full-Trust Farm Solution)、部分信任的沙盒解决方案(Partial-Trust Sandboxed Solution)和SharePoint应用(Apps for SharePoint)。
编程模型:
说这个之前,我们先来大致地回顾一下SharePoint开发的历史,本人从2007版本开始接触,之前的就不做陈述了。
SharePoint 2007主要的开发手段是Server API和WebService(ASMX),并没有沙盒解决方案的概念,客户端对象模型也并未明确提出。也就是说,你的自定义代码要么运行在SharePoint的服务端,要么通过内置的Web服务((%COMMONPROGRAMFILES%\Microsoft Shared\web server extensions\12\ISAPI,即_vti_bin这个URL路径下)托管在你自己的服务层中进行操作。
SharePoint 2007的客户端对象模型相当有限,在Core.js这个JS文件中实现(据书记载,在Windows SharePoint Services 2003的时候是OWS.js),该文件在SharePoint的大部分页面中被引用,不修改的话则仅包含很有限的逻辑处理操作。例如,Core.js提供了ECB的生成逻辑如下:
function AddDocLibMenuItems(m, ctx) { if (typeof (Custom_AddDocLibMenuItems) != "undefined") { if (Custom_AddDocLibMenuItems(m, ctx)) return; } // build the rest of OOTB ECB menu items }
我们通过SharePoint Designer来插入Custom_AddDocLibMenuItems函数到SharePoint页面上来实现我们自己的逻辑,或者是使用内容编辑Web部件(CEWP)来插入自定义的JS脚本函数。这种方式能实现的东西很有限,而且灵活性很差,如果因为一些原因Core.js没有被加载完,那么我们的自定义扩展就不好用了。
在SharePoint 2010中,客户端对象模型(CSOM)被极大地改善了,客户端模型从根本上来说是叫做Client.svc的WCF服务,附带三种不同的代理:Silverlight、JavaScript和.NET托管客户端(C#或VB.NET)。下面的代码片段展示了如何应用客户端对象模型(JS、sp.js)执行异步查询操作:
ExecuteOrDelayUntilScriptLoaded(GetTitle, "sp.js"); function GetTitle() { //Retrieve current client context context = SP.ClientContext.get_current(); //Load the site site = context.get_web(); context.load(site); //Execute asynchronously with callbacks for successful or failed calls context.executeQueryAsync(onQuerySucceeded, onQueryFailed); }
接下来,到了SharePoint 2013。它极大地丰富了开发的对象模型,如下图。总体概括来说,有服务端对象模型(Server API)、客户端对象模型(CSOM)和Web服务(REST\OData Endpoint)。
最耀眼的就是跨平台的REST服务,但有一点,Server API无论何时都有其不可替代性,因为一些服务器端的定制、TimerJob等的开发工作只能用完全信任的场解决方案来部署。我们可以根据实际情况来选择合适的API进行开发工作,更多信息。微软方面推荐开发者遵循新的应用程序模型作为优先选择方式来构建SharePoint 2013自定义的应用程序。"don't make any new sandboxed solutions"和"build new farm solutions only you absolutely have to"。
在SharePoint 2013中,_vti_bin/client.svc作为别名_api存在,即REST,更容易辨认,调用起来更方便,架构如下图所示。
使用REST查询信息非常简单,如查询ID为1的联系人:
http://contoso.com/_api/web/lists/getByTitle('Contacts')/getItemByStringId('1')
又如,我们想删除某个联系人,用如下的代码片段:
removeItem = function (id) { $.ajax( { url: _spPageContextInfo.webServerRelativeUrl + "/_api/web/lists/getByTitle('Contacts')/getItemByStringId('" + id + "')", type: "DELETE", headers: { "accept": "application/json", "X-RequestDigest": $("#__REQUESTDIGEST").val(), "IF-MATCH": "*" }, success: function (data) { readAll(); }, error: function (err) { alert(JSON.stringify(err)); } } ); }
另一方面,之前在SharePoint 2010中只能用服务端对象模型实现的如用户配置文件、工作流、搜索等方面的部分可以用客户端对象模型CSOM实现了。
下一篇我们将介绍SharePoint全新的模式——SharePoint APP。