仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1120|回复: 16
打印 上一主题 下一主题

[学习教程] ASP.NET网页设计SharePoint对象模子功能考量仓酷云

[复制链接]
山那边是海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:21:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。SharePoint对象模子(ObjectModel)同意内部使用程序或托管的WebPart来查询、编纂和创立存储在SharePoint内容数据库(ContentDatabase)中的内容。有良多博客文章、常识库文章和最好理论中,都谈到怎样在分歧的用例场景中利用对象模子。
年夜部分罕见用例场景都是关于显现和编纂SharePoint列表的——惋惜,这也是我们看到良多功能成绩呈现的中央,这是由于SharePoint对象模子其实不老是以功能优化的体例被利用。
用例1:在SharePoint列表中,存储了几项目?

有多种体例往返答这个成绩。我已经看到良多次的一个例子是上面如许:
  1. intnoOfItems=SPContext.Current.List.Items.Count;
复制代码
这句代码告知我们在列表中数据项的数量,为了失掉这个了局不能不从内容数据库中猎取列表的一切项目。上面的截图显现了,当下面代码在会见Count属性的时分,对象模子外部的实行历程:

<br>
关于小型列表,这不会有成绩,查询仍是对照敏捷。不外当列表增加数倍,或自界说代码从未在实践数据上测试过的话,这将成为一个成绩。
关于这类情形,微软为SPList供应了别的一个属性,名为ItemCount。准确的代码应当是:
  1. intnoOfItems=SPContext.Current.List.ItemCount;
复制代码
在这类情形下,SharePoint只用在内容数据库中查询Lists数据表的单个纪录。在列表中数据项的数目会被冗余地存储在这,以便无需查询全部AllUserData数据表(一切的SharePoint列表项目都保留在这里)便可取得这个信息。
用例2:利用SPList显现列表中的项目?

经由过程SharePoint对象模子,有多种办法能够遍历SharePoint列表的数据项。我已经在一个实践运转的SharePoint使用程序中见到的如许一个体例——在开辟职员呆板上或在十分小的列表上大概会事情一般,可是一旦在凌驾几百条数据项的列表上实行,这类体例就会呈现致命的功能成绩。让我们看一下代码片断,它被用于一个WebPart中,从以后高低文的SharePoint列表中猎取前100个数据项:
  1. SPListactiveList=SPContext.Current.List;for(inti=0;i<100&&iSPListItemlistItem=activeList.Items[i];htmlWriter.Write(listItem["Title"]);}
复制代码
假定在这个列表中最少有100条数据项——这段代码为了猎取前100个SharePoint列表数据项的100个Title值,会往复会见数据库几次?你大概会很惊奇。经由对上述代码的实行历程的剖析,在你看到来着数据库的视图的时分,一共对数据库举行了200次挪用:

<br>
缘故原由在于,在每次轮回中,当会见Items属性的时分,我们都哀求了一个新的SPListItemCollection对象。Items属性未被缓存,因而老是从数据库中重复不休地哀求一切数据项。上面是第一个轮回迭代的情形:

<br>
准确的办法
准确的办法固然是把Items属性的前往值存储在一个SPListItemCollection变量中。如许,数据库就只会查询一次,而且我们接上去也能够遍历存储在汇合对象内里的了局集。上面是修正后的示例代码:
  1. SPListItemCollectionitems=SPContext.Current.List.Items;for(inti=0;i<100&&iSPListItemlistItem=items[i];htmlWriter.Write(listItem["Title"]);}
复制代码
你也能利用foreach轮回语句,它会被编译为相似的代码,其充实使用了Items汇合的IEnumerable接口。上面是新的轮回在外部怎样被处置的历程:

<br>
用例3:利用SPQuery和SPView只哀求你真正必要的数据

在必需处置来自数据库的数据的任何范例使用程序中,我们都能见到的一个次要功能成绩是,有太多半据要会见。哀求比以后用例所需的数据量更多的信息,会招致分外的:


  • 在数据库上的查询开支,以便搜集哀求信息
  • 在数据库和使用程序之间的通信开支
  • 在数据库和使用程序上的内存开支
转头看一下后面2个用例,你会发明被实行的SQLStatement老是从哀求的SharePoint列表当选取了一切数据项。你能够说你看到SELECT子句是如许誊写:SELECTTOP2147483648……
限定前往行的数目
在会见SharePoint列表中的数据项的时分,万一你只想失掉无限数目的了局集,那末你能够使用SPQuery.RowLimit属性。
上面是一个例子:
  1. SPQueryquery=newSPQuery();query.RowLimit=100;SPListItemCollectionitems=SPContext.Current.List.GetItems(query);for(intitemIx=0;itemIxSPListItemlistItem=items[itemIx];}
复制代码
在SPList.GetItems办法中利用SPQuery对象,将天生包括以下SELECT子句的了局。

<br>
在之前的例子中,我们已限定了想要猎取的数据项数量。但是,我们仍旧仍是哀求了界说在SharePoint列表中的一切列。关于真正必要把一切列都显现给终极用户,大概必要一切列来完成某些盘算的情形,如许做毫无成绩。但是,在年夜部分情形下,我们只必要几个而不是全体的列。
限定检索列
有两种办法来限定哪些列要从数据库检索:


  • 利用SharePoint视图:SPView
  • 利用SPQuery.ViewFields属性
因而下面的示例代码能够用以下两种体例举行修正:
  1. SPQueryquery=newSPQuery(SPContext.Current.CurrentView.View);
复制代码
  1. SPQueryquery=newSPQuery();query.ViewFields="";
复制代码
在两种场景中,SELECT子句都只包括那些界说在SharePoint视图中的字段,这些字段各安闲ViewFields属性中被援用:

<br>
用例4:经由过程SPQuery来对SharePoint列表数据项举行分页

SharePoint列表能包括不计其数的数据项。我们都传闻,为了取得较好的列表功能,不该该凌驾2000条的限制。当凌驾这个限制后,的确存在功能影响。有一些办法能够克制这个限制,就是利用索引列和视图。
在会见列表中的数据时,除思索这些要素外,另有一个方面对照主要。在之前的用例中已注释过——只会见你必要的数据能够年夜年夜下降SharePoint内容数据库的压力。别的,SharePoint对象模子也供应了一些分外的特征来增强会见列表数据项的才能。
数据分页就是个中一个手艺,就是我们在富客户端使用程序或Web使用程序中已熟知的,利用数据网格相似的体例。分页让终极用户便利地导航数据,而且——假如准确地完成的话——能够削减低层数据库的负载。
SPQuery对象供应了属性ListItemCollectionPosition,经由过程它你可以设定查询页的肇端地位。RowLimit让你设定每页要猎取几数据项。让我们来看一些示例代码:
  1. SPQueryquery=newSPQuery();query.RowLimit=10;//thatisourpagesizedo{SPListItemCollectionitems=SPContext.Current.List.GetItems(query);//dosomethingwiththepageresult//setthepositioncursorforthenextiterationquery.ListItemCollectionPosition=items.ListItemCollectionPosition;}while(query.ListItemCollectionPosition!=null)
复制代码
SPList.GetItems实行了这个查询,每次挪用GetItems只前往10条数据项。SPListItemCollection供应的ListItemCollectionPosition属性就像SharePoint列表上的一个指针。这个属功能用于任何页面遍历,以界说下一页的肇端点。上面的插图显现了数据库的举动:

<br>
细心看一下展示给我们的这个SQLStatement,它夹杂了SELECTTOP和WHERE子句,用于猎取某个页的数据项:

<br>
用例5:更新大批的SharePoint列表数据项

之前的用例存眷于存储在SharePoint列表中的数据项的读取会见。如今来会商一下怎样更好地更新或增加新数据项了。因为SharePoint对象模子供应了丰厚的接口,以是我们又能够在多种体例中举行选择了。
在SharePoint列表中增加和更新数据项的第一个不言而喻的体例是,SPListItem.Update。要取得一个列表数据项,既能经由过程查询一个现存数据项,又能够用SPListItemCollection.Add来增加一个新的。
让我们看一下以下的例子:
  1. for(intitemIx=0;itemIx<100;itemIx++){SPListItemnewItem=items.Add();//fillalltheindividualfieldswithvaluesnewItem.Update();}
复制代码
对这段代码举行剖析,我们看到对Update办法的每次挪用实践上都挪用了外部办法SPListItem.AddOrUpdateItem,它现实上是挪用了一个存储历程来完成这个义务:

<br>
我们看到,增加100条数据项到我的列表中,消费了4.5秒的工夫。
利用批量更新取代单个更新
假如你必需更新大批的数据项,激烈倡议你不要在每一个数据项上自力利用Update办法。而是,利用SPWeb供应的批量更新函数ProcessBatchData。
ProcessBatchData实行以XML格局界说的批量办法。这里有一篇很好的文章注释了怎样利用批量更新。经由过程使用批量更新,能够把下面的例籽实现为如许:
  1. StringBuilderquery=newStringBuilder();for(intitemIx=0;itemIx<100;itemIx++){query.AppendFormat(""+"{1}"+"New"+"Save"+"{2}"+"",itemIx,listGuid,someValue,"urn:schemas-microsoft-com:office:office#");}SPContext.Current.Web.ProcessBatchData(""+"{0}",query.ToString())
复制代码
经由过程ProcessBatchData增加一样的100条数据项,经由过程剖析外部机理,我们晓得在更新过程当中消费了几工夫:

<br>
两种更新体例的对照标明,我们能够经由过程批量更新来取得伟大的功能提拔:

<br>
注重
批量更新实践上只在实行大批更新的时分才被保举。不外,请思索一下创立批量更新XML的花消:


  • 确保利用StringBuilder,而不是把一些自力字符串对象毗连在一同。
  • 支解批量更新挪用,以坚持天生的XML充足小,不会呈现内存溢出非常。在实行上述包括了50000个批量更新的例子的时分,我就碰到了OOM(内存溢出)。
用例6:哪个是我最慢的列表,它们怎样被利用和为何会慢?

我们晓得,SharePoint列表功能跟着存储在个中的数据项的数目增添而下降,而且也和显现的时分,列表怎样举行过滤有关。你能够找到谈及每一个列表2000条数据项限制的良多文章和博客帖子。
为了做准确的事取得优秀的功能,起首必要懂得以后的利用情形并剖析功能成绩。
有几种体例能够算出你的SharePoint使用程序确当前会见统计量。你能够剖析IIS日记文件,大概利用SharePoint利用率呈报特征(SharePointUsageReportingFeature)。
监测列表功能最复杂的体例就是剖析各个SharePointList和SharePointView的URL的HTTP呼应次数。SharePointURL的格局相似如许:http://servername/site/{LISTNAME}/{VIEWNAME}.aspx。
为了剖析它,我们能够基于这两个标志来对哀求举行分组。我利用dynaTrace的BusinessTransaction特征按照正则表达式来分组捕捉到的PurePath"s。

<br>
如许的了局让我们分明,哪些列表和视图利用最频仍,它们体现怎样。
别的,对HTTP哀求举行剖析——它只为那些显现特定列表或视图的页面供应正确的数据——如许,我们就可以剖析自界说Web部件或自界说页面的列表利用率,它们常常比单个列表或视图被会见得更多,也比那些以特定过滤体例来会见列表的情形多。
我们也能剖析与SharePoint对象模子交互的情形,好比被用于出现列表和视图的SPRequest.RenderViewAsHtml的利用情形,对SPList和SPView的会见情形。上面的插图显现了对SPRequest办法挪用的利用率和功能目标:

<br>
下面的插图给我们展示了,列表的外部GUID。每一个列表和视图都经由过程GUID来独一标识。这是查找实在列表称号的别的一种体例:你能够吧GUID粘贴进URL中,以编纂列表和视图的设置。上面是一个例子:
  1. intnoOfItems=SPContext.Current.List.ItemCount;0
复制代码
这为我们供应了别的一种翻开内容数据库和查询AllLists数据表的体例。这个数据表包括着GUID和List称号。
列表为何慢?
如今,因为我们已晓得哪些列表和视图被频仍会见,我们就可以重点存眷那些让功能下落的中央。为了改良终极用户体验,我们应当会合在最频仍会见的列表上,而不是那些偶然会见一下的列表。
列表体现迟缓,存在有多种缘故原由:


  • 有太多的数据项显现在列表视图中
  • 有太多的数据项保留于没有过滤和索引列的列表中
  • 自界说Web部件举行了有效率的数据会见
Conclusion

SharePoint对象模子供应了一种轻松的天真的体例来扩大SharePoint使用程序。这个框架供应了分歧的机制来会见和编纂存储在SharePoint列表中的数据。但是,不是每种大概的体例关于每一个用例场景都是可取的。懂得SharePoint对象模子的外部道理可让我们创立的SharePoint使用程序运转得更好,功能更容易伸缩。
关于作者

AndreasGrabner作为一个手艺计谋决议者,事情于dynaTraceSoftware。他的脚色回属R&D部门,影响着dynaTrace产物决议,并和关头客户严密合作,为全部使用程序性命周期完成了功能办理办理计划。AndreasGrabner在Java和.NET范畴具有10年的构架和开辟履历。
关于作者的店主:dynaTracesoftware

dynaTrace是为实行关头营业的Java和.NET使用程序的全部性命周期,供应延续使用程序功能办理办理计划的向导者。dynaTrace为一切关头好处相干人(开辟、测试和产物)供应通用的、集成的功能办理平台的最好办理计划。诸如UBS、LInkedIn、EnerNOC、Fidelity和ThomsonReuters如许的行业首脑,都是利用dynaTrace正在请求专利的手艺,以期取得对使用程序功能完整的掌控、尽早地辨认成绩,并极年夜地削减了均匀修复工夫(削减了90%)。这些和其他一些向导厂商依附于dynaTrace的手艺,主动避免突发的功能成绩,并在呈现的时分疾速办理它们——节俭了工夫、款项和资本。
检察英文原文:SharePointObjectModelPerformanceConsiderations.
来自:http://www.infoq.com/cn/articles/SharePoint-Andreas-Grabner
什么叫数据库怎么样?什么意思?你想单学数据库。(其实变成是我问的)
兰色精灵 该用户已被删除
沙发
发表于 2015-1-19 14:01:50 | 只看该作者
由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。
海妖 该用户已被删除
板凳
发表于 2015-1-24 12:47:45 | 只看该作者
同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。
简单生活 该用户已被删除
地板
发表于 2015-2-1 12:33:55 | 只看该作者
ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。
小魔女 该用户已被删除
5#
发表于 2015-2-9 01:53:47 | 只看该作者
ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp)。
若相依 该用户已被删除
6#
发表于 2015-2-26 17:58:29 | 只看该作者
弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。
只想知道 该用户已被删除
7#
发表于 2015-3-3 01:02:29 | 只看该作者
它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。
变相怪杰 该用户已被删除
8#
发表于 2015-3-11 07:17:42 | 只看该作者
可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
若天明 该用户已被删除
9#
发表于 2015-3-17 23:08:09 | 只看该作者
asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源
飘飘悠悠 该用户已被删除
10#
发表于 2015-3-17 23:08:09 | 只看该作者
逐步缩小出错代码段的范围,最终确定错误代码的位置。
11#
发表于 2015-3-17 23:08:09 | 只看该作者
是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。
深爱那片海 该用户已被删除
12#
发表于 2015-3-17 23:08:09 | 只看该作者
ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。
admin 该用户已被删除
13#
发表于 2015-3-17 23:08:10 | 只看该作者
微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。
飘飘悠悠 该用户已被删除
14#
发表于 2015-3-17 23:08:13 | 只看该作者
网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项!
灵魂腐蚀 该用户已被删除
15#
发表于 2015-3-17 23:08:13 | 只看该作者
Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
莫相离 该用户已被删除
16#
发表于 2015-3-17 23:08:13 | 只看该作者
对于中小项目来说.net技术是完全可以胜任,但为什么现在大型公司或网站都选择php或java呢?就是因为微软不够开放,没有提供从硬件到应用服务器再到业务应用的整套解决方案。
小妖女 该用户已被删除
17#
发表于 2015-3-25 05:31:39 | 只看该作者
Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-3 19:44

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表