使用ExceptionHandlingScope进行高效的SharePoint CSOM编程
异常处理
在我们使用SharePoint API的时候,获取某些对象的时候,可能会出异常,那么CSOM如何处理这种情况呢。
我们在获取某个List的时候,代码如下:
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 currentWeb = clientContext.Web;
//此API调用时,如果此List在服务器端不存在,会出现异常。
var list = currentWeb.Lists.GetByTitle("Documents Test");
clientContext.Load(list);
clientContext.ExecuteQuery();//执行查询,返回异常
}
如果服务器端出现异常,服务器会把异常的相关信息通过JSON对象返回给CSOM端。这里面,我们截取异常的Response来看一下:

这个JSON对象里面明确的显示了在执行GetListById的时候,返回的异常信息。
当通过currentWeb.Lists.GetByTitle("Documents Test") 获取List的时候,如果服务器端如果不存在这个List,会出现异常。我们在写服务器端的应用程序的时候,只需要try catch就可以了,但是我们知道ClientAPI本身的调用时通过WCF来进行调用的,我们只有在执行了ExecuteQuery之后,才知道服务器端是否出现异常,然后服务器把异常信息包装后返回给CSOM。
这种API的行为会给我们带来一系列的问题。如果我们在List不存在的时候,需要新建一个,如果通过不在CSOM引发异常的方式来执行呢?上面的例子中,如果我们在List不存在时新建一个List,仍然需要一次请求,如何能再一次请求中实现呢?
使用ExceptionHandlingScope来提高CSOM程序的性能
这个类就是我们用于处理服务器端异常的常用类。上面的例子中,我们可以用如下代码来实现。
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 currentWeb = clientContext.Web;
var exceptionHandlingScope = new ExceptionHandlingScope(clientContext);
//List list = null;
using (var currentScope = exceptionHandlingScope.StartScope())
{
using (exceptionHandlingScope.StartTry())
{
//此API调用时,如果此List在Server端不存在,会出现异常。
var listGetById = currentWeb.Lists.GetByTitle("Documents Test");
listGetById.Description = "List Get By Id";
listGetById.Update();
}
using (exceptionHandlingScope.StartCatch())
{
ListCreationInformation listCreationInfo = new ListCreationInformation();
listCreationInfo.Title = "Documents Test";
listCreationInfo.TemplateType = (int)ListTemplateType.DocumentLibrary;
listCreationInfo.Description = "List create in catch block";
currentWeb.Lists.Add(listCreationInfo);
}
}
List list = currentWeb.Lists.GetByTitle("Documents Test");
clientContext.Load(list);
clientContext.ExecuteQuery();//执行查询,不会出异常
//Server端是否出现了异常
Console.WriteLine("Server has Exception:" + exceptionHandlingScope.HasException);
//Server端异常信息
Console.WriteLine("Server Error Message:" + exceptionHandlingScope.ErrorMessage);
}
这个类解决了我们上面说的的问题,服务器端在编译的时候,会把ExceptionHandlingScope里面的代码编译成try catch这样的代码,因此我们可以通过一次请求来实现类似try catch这样的逻辑。
上面的代码再已经CSOM编译后的请求报文为:
<Request AddExpandoFieldTypeSuffix="true" SchemaVersion="15.0.0.0" LibraryVersion="15.0.0.0" ApplicationName=".NET Library"
xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009">
<Actions>
<ObjectPath Id="2" ObjectPathId="1" />
<ObjectPath Id="4" ObjectPathId="3" />
<ExceptionHandlingScope Id="5">
<TryScope Id="7">
<ObjectPath Id="10" ObjectPathId="9" />
<ObjectPath Id="12" ObjectPathId="11" />
<ObjectIdentityQuery Id="13" ObjectPathId="11" />
</TryScope>
<CatchScope Id="15">
<ObjectPath Id="18" ObjectPathId="17" />
<ObjectIdentityQuery Id="19" ObjectPathId="17" />
</CatchScope>
</ExceptionHandlingScope>
<Query Id="22" ObjectPathId="11">
<Query SelectAllProperties="true">
<Properties />
</Query>
</Query>
</Actions>
<ObjectPaths>
<StaticProperty Id="1" TypeId="{3747adcd-a3c3-41b9-bfab-4a64dd2f1e0a}" Name="Current" />
<Property Id="3" ParentId="1" Name="Web" />
<Property Id="9" ParentId="3" Name="Lists" />
<Method Id="11" ParentId="9" Name="GetByTitle">
<Parameters>
<Parameter Type="String">Documents Test</Parameter>
</Parameters>
</Method>
<Method Id="17" ParentId="9" Name="Add">
<Parameters>
<Parameter TypeId="{e247b7fc-095e-4ea4-a4c9-c5d373723d8c}">
<Property Name="CustomSchemaXml" Type="Null" />
<Property Name="DataSourceProperties" Type="Dictionary" />
<Property Name="Description" Type="Null" />
<Property Name="DocumentTemplateType" Type="Int32">0</Property>
<Property Name="QuickLaunchOption" Type="Enum">0</Property>
<Property Name="TemplateFeatureId" Type="Guid">{00000000-0000-0000-0000-000000000000}</Property>
<Property Name="TemplateType" Type="Int32">101</Property>
<Property Name="Title" Type="String">Documents Test</Property>
<Property Name="Url" Type="Null" />
</Parameter>
</Parameters>
</Method>
</ObjectPaths>
</Request>
从这个报文,中我们已经可以大致看出CSOM如何表示这种try catch finally的代码块。我们可以看到ExceptionHandlingScope也是和ClientObject一样有Id信息,这样服务器端就可以把对应的代码编译成server端的try catch finally了。
由于CSOM是基于http请求的,因此尽可能的减少请求,对于我们写出高效的程序至关重要。
下一篇文章主要会介绍 ConditionalScope的使用。
使用ExceptionHandlingScope进行高效的SharePoint CSOM编程的更多相关文章
- 使用ConditionalScope进行高效的SharePoint CSOM编程
在上一篇文章中讲述了 ExceptionHandlingScope的使用后,本章主要讲述ConditionalScope的用法. ConditionalScope在设计思路和解决问题上同Excepti ...
- 使用SharePoint CSOM 编写高效的程序
上一篇文章中简单的介绍了使用CSOM进行编程.今天主要讲一下CSOM使用中一些小技巧,可以让你的程序运行的更快. 单独加载某些属性 在上文中的例子,需要返回Web对象信息的时候,我们使用了如下的代码: ...
- 在设置代理的环境下使用SharePoint CSOM
SharePoint 的CSOM都是通过HttpRequest来实现和SharePoint服务器的交互的,那么我们如何设置HttpWebRequest的一些特性呢,如Cookie,WebProxy? ...
- SharePoint 2013的REST编程基础
1. SharePoint 2013对REST编程的支持 自从SharePoint2013开始, SharePoint开始了对REST 编程的支持,这样除了.NET , Silverlight, Po ...
- SharePoint 2013 开发——搜索架构及扩展
博客地址:http://blog.csdn.net/FoxDave SharePoint 2013高度整合了搜索引擎,在一个场中只有一个搜索服务应用程序(SSA).它集成了FAST,只有一个代码库 ...
- SharePoint 入门书籍推荐 转载来源http://www.cnblogs.com/jianyus/p/3513238.html
最近,总有人说刚入门SharePoint,没有好的资料或者电子书,资料推荐大家多看看博客园和CSDN的博客.对于看博客,我一般是两个思路,要么找一个人的从头到尾看一遍,觉得有意义的,就把地址加收藏:或 ...
- 什么是SharePoint?
在聊SharePoint开发之前,有必要说下什么是SharePoint. 在我工作的过程中,经常遇到客户对SharePoint不太了解的情况.有客户说,SharePoint太烂了,DropBox能做到 ...
- SharePoint 入门书籍推荐
最近,总有人说刚入门SharePoint,没有好的资料或者电子书,资料推荐大家多看看博客园和CSDN的博客.对于看博客,我一般是两个思路,要么找一个人的从头到尾看一遍,觉得有意义的,就把地址加收藏:或 ...
- 实现一个基于 SharePoint 2013 的 Timecard 应用(中)
门户视图 随着 Timecard 列表的增多,如何查找和管理这许多的 Timecard 也就成了问题.尤其对于团队经理而言,他除了自己填写的 Timecard,还要审核团队成员的 Timecard 任 ...
随机推荐
- css颜色大全-转载
FFFFFF #DDDDDD #AAAAAA #888888 #666666 #444444 #000000 #FFB7DD #FF88C2 #FF44AA #FF0088 #C10066 #A ...
- [转]LIBSVM-3.18在python环境下的使用
http://blog.csdn.net/lj695242104/article/details/39500039 1)安装Python,直接去官方网站 2)运行“cmd”,直接输入python,查看 ...
- SCI写作经验交流,别人的经验借鉴下,很有用的!
http://www.dxy.cn/bbs/topic/27127771 语言是非英语国家论文的最大障碍.首先是时态和语态:在前言和讨论里,描述该研究的过去历史和现状时,要使用相应的时态:过去就使用过 ...
- pip使用
安装指定版本的插件: pip install -v matplotlib==1.5.1 #安装matplotlib version 1.5.1
- HttpServletRequest
javaweb学习总结(十)——HttpServletRequest对象(一) 一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HT ...
- CentOS 7下源码安装MySQL 5.7
网上说linux安装mysql服务分两种安装方法: ①源码安装,优点是安装包比较小,只有几十M左右,缺点是安装依赖的库多,安装编译时间长,安装步骤复杂容易出错: ②使用官方编译好的二进制文件安装,优点 ...
- Segmetation fault你来的真不是时候
问题是这样的,今天一个简单的C程序,用gcc编译成汇编语言后,本来想在里面改点东西,结果运行时就报了"Segmetation fault".它丫来的还真不是时候,刚好最近正好烦它呢 ...
- js闭包和回调
1.闭包 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.闭包有三个特性: 1.函数嵌套函数; 2.函数内部可以引用外部的参数和变量; 3.参数 ...
- adb server is out of date killing... 的解决办法
是adb server端口被占用了 你先执行adb nodaemon server ,查看adb server的端口是多少 1 2 C:\Users\xxxx>adb nodaemon serv ...
- 递推 N三角形问题
Description 用N个三角形最多可以把平面分成几个区域? Input 输入数据的第一行是一个正整数T(1<=T<=10000),表示测试数据的数量.然后是T组测试数据,每组测试数据 ...