使用ExceptionHandlingScope进行高效的SharePoint COM编程

异常处理

在我们使用SharePoint API的时候,获取某些对象的时候,可能会出异常,那么COM如何处理这种情况呢。

我们在获取某个List的时候,代码如下:

            using (ClientContext clientContext = new ClientContext("https://cnblogtest.sharepoint.com"))
            {

                var pasword = new SecureString();

                "[email protected]#".ToCharArray().ToList().ForEach(pasword.AppendChar);

                clientContext.Credentials = new SharePointOnlineCredentials("[email protected]", pasword);//设置权限

                var currentWeb = clientContext.Web;

                //此API调用时,如果此List在服务器端不存在,会出现异常。
                var list = currentWeb.Lists.GetByTitle("Documents Test");

                clientContext.Load(list);
                clientContext.ExecuteQuery();//执行查询,返回异常

            }

  

如果服务器端出现异常,服务器会把异常的相关信息通过JSON对象返回给COM端。这里面,我们截取异常的Response来看一下:

这个JSON对象里面明确的显示了在执行GetListById的时候,返回的异常信息。

当通过currentWeb.Lists.GetByTitle("Documents Test") 获取List的时候,如果服务器端如果不存在这个List,会出现异常。我们在写服务器端的应用程序的时候,只需要try catch就可以了,但是我们知道ClientAPI本身的调用时通过WCF来进行调用的,我们只有在执行了ExecuteQuery之后,才知道服务器端是否出现异常,然后服务器把异常信息包装后返回给COM。

这种API的行为会给我们带来一系列的问题。如果我们在List不存在的时候,需要新建一个,如果通过不在COM引发异常的方式来执行呢?上面的例子中,如果我们在List不存在时新建一个List,仍然需要一次请求,如何能再一次请求中实现呢?

使用ExceptionHandlingScope来提高COM程序的性能

这个类就是我们用于处理服务器端异常的常用类。上面的例子中,我们可以用如下代码来实现。

            using (ClientContext clientContext = new ClientContext("https://cnblogtest.sharepoint.com"))
            {
                var pasword = new SecureString();
                "[email protected]#".ToCharArray().ToList().ForEach(pasword.AppendChar);

                clientContext.Credentials = new SharePointOnlineCredentials("[email protected]", 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这样的逻辑。

上面的代码再已经COM编译后的请求报文为:

<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>

从这个报文,中我们已经可以大致看出COM如何表示这种try catch finally的代码块。我们可以看到ExceptionHandlingScope也是和ClientObject一样有Id信息,这样服务器端就可以把对应的代码编译成server端的try catch finally了。

由于COM是基于http请求的,因此尽可能的减少请求,对于我们写出高效的程序至关重要。

时间: 2024-11-02 05:16:38

使用ExceptionHandlingScope进行高效的SharePoint COM编程的相关文章

使用ConditionalScope进行高效的SharePoint COM编程

在上一篇文章中讲述了 ExceptionHandlingScope的使用后,本章主要讲述ConditionalScope的用法. ConditionalScope在设计思路和解决问题上同ExceptionHandlingScope几乎是相同的,主要为了解决如何在一次请求中实现if else这样需求. 我们知道,在SharePoint API中,获取不到某些对象时,有的时候是出异常的,有的时候是返回空的,有的时候是能返回对象,但是只能使用某些属性.本文中使用的例子就是文件对象,使用过ServerA

精讲shell基础以及如何高效的学习shell编程

1.前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大部分涉及Shell脚本的内容.每一个合格的Linux系统管理员或运维工程师,都需要熟练的编写Shell脚本语言,并能够阅读系统及各类软件附带的Shell脚本内容.只有这样才能提升运维人员的工作效率,适应日益复杂的工作环境,减少不必要的重复工作,从而为个人的职场发展奠定较好的基础 1.2 学好Shell编程所需的基础知识

零基础如何高效学习Java技术编程

Java编程是一个技术活,没有专业知识,那是行不通的.这也决定了程序员的不可替代性,不是你随便招一个人就可以立马开工. 很多人在转行跨界去接触一个自己从来不懂的行业时往往内心充满了恐惧,也许会高估了这个行业的难度,当然Java编程行业的难度还是有的,不是谁都能随随便便成功. 作为一个零基础的小白,我们该如何高效率的学习Java技术呢?It培训网Java老师给我们提出了以下三点: 第一:目标明确 因为是转行过来的,明确目标很重要.比如我们已经选定了要学习Java,就要一鼓作气,不能做墙头草,随风倒

【提高C++性能的编程技术】读书笔记1 -- 导言

[纸上得来终觉浅] 最近开始看这本书,站在巨人的肩膀上,希望有更大的收获!! 一个程序的执行效率是取决于改程序翻译成汇编语言之后的执行的机器指令的条数.而每一个机器指令的执行的周期是一定的.C语言和C++都是高于汇编语言的高级语言,其中,C语言源代码与其相应的机器指不是完全同一的,但是大致是线性的,但是C++语言的源代码与编译代码的开销变化很大的.一条C++指令可能对应于3条汇编指令,而另外的一条可能对应300条.正因为这样,很多时候我们写出来的代码本身就是低效的,这不能全然怪罪于C++语言本身

什么是SharePoint?

在聊SharePoint开发之前,有必要说下什么是SharePoint. 在我工作的过程中,经常遇到客户对SharePoint不太了解的情况.有客户说,SharePoint太烂了,DropBox能做到的什么什么功能,SharePoint竟然做不到,很明显这种客户把SharePoint当成了一个云盘.那么什么是SharePoint呢? 根据Microsoft的说法,SharePoint是一个企业级的协作平台.这个说起来有点抽象啊 :) 那我们先看看SharePoint的发展历史吧.其实最开始的时候

使用PowerShell 创建SharePoint 网站

使用PowerShell 创建SharePoint 网站 在SharePoint开发中,你应该学会使用PowerShell管理SharePoint站点.SharePoint Management Shell是一个Windows PowerShell模块,你可以用它高效管理SharePoint 用户.站点.网站集和组织. 这里教你简单的语句,创建一个SharePoint网站. 输入一下语句.红色框内信息是按下Enter后出现的. 建立的网站如下: 首先我们需要理解如何使用PowerShell创建站

SharePoint 服务器端对象模型 之 使用LINQ进行数据访问操作(Part 2)

(四)使用LINQ进行列表查询 在生成实体类之后,就可以利用LINQ的强大查询能力进行SharePoint列表数据的查询了.在传统SharePoint对象模型编程中,需要首先获取网站对象,再进行其他操作:使用LINQ也是类似,对数据的访问和操作都要先获取DataContext网站,之后再通过这个DataContext进行数据访问. 1.获取网站和列表 DataContext的创建同样也是要使用绝对路径进行构造,并使用GetList方法获取相应的列表.例如下面的代码获取Chapters列表中所有的

第1章 游戏之乐——双线程高效下载

参考链接: [编程之美]双线程高效下载 [编程之美]双线程高效下载 编程之美--多线程高效下载的问题 编程之美——双线程高效下载 [编程之美]双线程高效下载

SharePoint 2013 开发——搜索架构及扩展

??博客地址:http://blog.csdn.net/FoxDave SharePoint 2013高度整合了搜索引擎,在一个场中只有一个搜索服务应用程序(SSA).它集成了FAST,只有一个代码库,不同的授权层次启用不同的搜索功能,但是有些功能在云端是不可用的. 下图从开发者的视角展示了搜索架构,摘选自SharePoint高级编程. 图中标记灰色的部分就是我们在开发过程中可以应用或扩展的部分.我们可以通过REST或CSOM API来对查询模块进行定义和扩展:通过BCS来创建新的索引连接:借助