设为首页 收藏本站
查看: 1121|回复: 0

[经验分享] SharePoint2010企业开发最佳实践(一)----在 SharePoint Server 中编写有效代码

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-9-29 11:33:18 | 显示全部楼层 |阅读模式
  如果使用 SharePoint 对象模型编写自定义解决方案,应该注意与性能、可扩展性和可伸缩性相关的常见问题。本主题可以帮助您有效地对现有 SharePoint 应用程序进行故障排除并提高其性能,或者编写新 SharePoint 应用程序。在这两种情况下,都需要了解如何使 SharePoint 对象模型高效地工作,以及如何将常规编程技巧专门应用于 SharePoint 平台。
  
  使用SPQuery对象
  

设计合理的查询可以帮助您避免随着时间的推移而可能出现的性能问题,因为网站的列表和文件夹数目会不断增加。以下技巧可以帮助您尽可能最高效地使用 SPQuery 对象。


  •   使用界定的 SPQuery 对象。
      RowLimit 没有相应值的 SPQuery 性能不佳,并且无法用于大型列表。请为 RowLimit 指定一个 1 到 2000 之间的值,并根据需要分页显示列表。
  •   限制结果集。
      如果查询返回的项目多于在 Microsoft SharePoint Foundation 2010 中配置的查询阈值,则将阻止查询并且不显示结果。默认查询阈值为 5,000 项,但您可以将其设置为更小的值。对于 Microsoft SharePoint Server 2010 查询,如果您需要所有项目,请使用 ContentIterator.MaxItemsPerQuery 并分页显示结果。
  •   使用索引字段。
      如果所查询的字段未编制索引,并且生成的扫描在列表中遇到的项目多于查询阈值,则将阻止查询。请将 SPQuery.RowLimit 设置为小于查询阈值的值。确保 ContentIterator.MaxItemsPerQuery 的值小于或等于该阈值,这是为 SharePoint Server 2010 推荐的值。
  •   确保包含以下三个 OrderBy 子句之一,以便允许使用索引:ContentIterator.ItemEnumerationOrderByID、ContentIterator.ItemEnumerationOrderByPath 或 ContentIterator.ItemEnumerationOrderByNVPField。
      如果没有 OrderBy 子句,则查询可能会被阻止。SharePoint Server 2010 添加了默认 OrderBy 子句,该子句按内容类型进行排序,以便确保先返回文件夹,然后再返回列表项。除非使用上面列出的三个 OrderBy 子句之一覆盖此行为,否则查询将不能充分发挥使用索引字段的优势,并且当查询的限制不够严格,无法保证返回的项目少于最大项目数时,查询将会被阻止。以下代码示例演示如何使用 ContentIterator.ItemEnumerationOrderByNVPField 子句。该示例假定您要查询索引字段。
  SPQuery query = new SPQuery();
query.Query =
"<Where><Eq><FieldRef Name=\"MyIndexedField\"/><Value Type=\"Text\">FieldValue</Value></Eq></Where>"
+ ContentIterator.ItemEnumerationOrderByNVPField;
ContentIterator ci = new ContentIterator();
ci.ProcessItemsInList(query,
    delegate(SPListItem item)
    {
        // Work on each item.
    },
    delegate(SPListItem item, Exception e)
    {
        // Handle an exception that was thrown while iterating.
        // Return true so that ContentIterator rethrows the exception.
        return true;
    }
);
  
使用 PortalSiteMapProvider
  

使用 PortalSiteMapProvider(仅限 Microsoft Office SharePoint Server 2007 和 Microsoft SharePoint Server 2010)。
Steve Peschka 的白皮书在 Office SharePoint Server 2007 中处理大型列表(英文)介绍了使用 PortalSiteMapProvider 类检索列表数据的有效方法。PortalSiteMapProvider 提供了用于检索列表数据的自动缓存基础结构。PortalSiteMapProvider 的 GetCachedListItemsByQuery 方法采用 SPQuery 对象作为参数,然后检查其缓存以确定项目是否已经存在。如果已经存在,则该方法返回缓存的结果。如果不存在,则该方法查询列表并将结果存储在缓存中。当检索的列表数据在一段时间内不会频繁更改时,该方法尤其有效。如果数据集频繁更改,则除了从数据库读取数据所产生的开销外,该类还会因为不断写入缓存而产生性能开销。请注意,PortalSiteMapProvider 类使用网站集对象缓存来存储数据。此缓存默认大小为 100 MB。您可以在每个网站集的对象缓存设置页上增加网站集的此缓存大小。但是,由于此内存来自供应用程序池使用的共享内存,因此可能会影响其他应用程序的性能。另一个重要限制是您不能在基于 Windows 窗体的应用程序中使用 PortalSiteMapProvider 类。以下代码示例显示如何使用此方法。
良好的编码实践
使用 PortalSiteMapProvider
// Get the current SPWeb object.
SPWeb curWeb = SPControl.GetContextWeb(HttpContext.Current);
// Create the query.
SPQuery curQry = new SPQuery();
curQry.Query = "<Where><Eq><FieldRef Name='Expense_x0020_Category'/>
<Value Type='Text'>Hotel</Value></Eq></Where>";
// Create an instance of PortalSiteMapProvider.
PortalSiteMapProvider ps = PortalSiteMapProvider.WebSiteMapProvider;
PortalWebSiteMapNode pNode = ps.FindSiteMapNode(curWeb.ServerRelativeUrl) as PortalWebSiteMapNode;
// Retrieve the items.
SiteMapNodeCollection pItems = ps.GetCachedListItemsByQuery(pNode, "myListName_NotID", curQry, curWeb);
// Enumerate through all of the matches.
foreach (PortalListItemSiteMapNode pItem in pItems)
{
// Do something with each match.
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-120401-1-1.html 上篇帖子: SharePoint 门户添加内网域名 下篇帖子: Sharepoint 2010 页面设计确实方便
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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