提高Sharepoint站点访问速度的几点建议

以前我的一篇Post提到了提高Sharepoint页面访问速度的一些要点,其中包括:不破坏Page Ghosting和使用一些基本的XHTML标准。那篇PostFeedback中有人对XHTML标准的使用提到了一些质疑,当然,我也不是一个XHTML的坚决拥护者,但是尽量使页面遵守一些基本的要点对页面的访问性能必有好处。当然,除了上面两点之外,还有一些CheckList是我们应该注意的,这篇Post我们就来讨论一下提高Sharepoint站点访问速度的一些建议!

首先,还是Page Ghosting的问题。要了解什么是Page GhostingBarry Kouda发表在MSD2D的这篇《What you don't know about Front Page 2003 can hurt you》会告诉你。当初次建立好一个WSS/SPS站点之后,用户访问一个具体的页面,此时的页面内容来自两个位置,一个是Page Ghosting,它的位置是在X:\Program Files\Common Files\Microsoft Shared\web server extensions\60\TEMPLATE目录下,它定义了页面的框架、样式、Web部件区域,而页面的内容则存储在数据库中。用户的请求被Sharepoint ISAPI接收到以后服务器端会从数据库中取出具体的内容,和Page Ghosting编译后的Assembly组装整个页面,然后返回HTML给客户端。整个WSS/SPS的页面都是基于Page Ghosting的(除了自己建立的Web部件页),那么页面外观框架的重用性就比较高,多个页面共享一个Page Ghosting的时候会带来不少性能方面的益处。然而Frontpage会破坏这一切(当然,有的时候他也必不可少),它会使使用它编辑过的页面部在使用Page Ghosting,而是将整个页面保存在了数据库中。在用户再次请求访问的时候,执行的工作就大不相同了,整个页面的框架和内容都需要从数据库中载入,而且不会再有重用。因此提高Sharepoint站点访问速度的第一个建议就是尽可能避免破坏Page Ghosting

第二个方面还是颇具争议的XHTML,下面的图是使用PowerBand查看的一个WSS页面的结构。
r_PowerbandWSS.gif
整个页面被包围在一个
Table中,然后是众多Table的嵌套。浏览器对HTML的解析和显示方式我们很清楚,当一个表格没有全部下载完成之前是不会显示出任何内容的。这样的代价是等待,等待所有的页面元素全部下载完。你只能看着进度条发呆了JXHTML的所有标准确实苛刻,况且IE浏览器也并非对XHTML绝对有好,我也不再强调完全的HTML,但我喜欢拆分页面的一个Table为多个,就像Sina的结构,多个表格,让Title部分可以优先页面载入完成前显示出来,然后依次向下。用户不必再毫无指望的发呆,总有一些期盼展示给他了。

第三个建议和WebPart的开发有关了。按照需求,我需要开发一些WebPart用于显示公司内其他OA系统的数据在我们的Portal上,有人事的信息,有财务的数据,还有工作流程的审批过程。我们的数据源来自其他系统提供的友好接口或Web Services。还有,我还需要从Internet上面请求一些新闻、天气之类的HTTP回来做成WebPart来使用J。那么问题又出现了!每个WebPart就像一个UserControl,页面按照一个顺序进行Render。取回人事数据花了2秒,Web Servers花了3秒,HTTP请求可能会等待5秒甚至更慢一些,这时候,我要访问的Sharepoint页面就至少需要10秒才能打开,当然这还是比较乐观的。你知道我要说什么了,是的,异步!具备异步机制的WebPart不再会让页面的Render事件累加,而必然小于那个我们不希望的时间。Microsoft.Sharepoint.dll本身支持异步数据获取,仔细读一下《Asynchronous Data Fetching》。其实实现起来蛮简单。一个最简单的例子:

None.gif public   class  AsyncWebPart1 : WebPart 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
bool m_AsyncWorkComplete = false;
InBlock.gif  
string m_Data = string.Empty;
InBlock.gif  
public override bool GetRequiresData()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    
return (m_AsyncWorkComplete==true);
ExpandedSubBlockEnd.gif  }

InBlock.gif  
public override void GetData()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    RegisterWorkItemCallback(
new WaitCallback(AsyncTask), "pass any call-specific data here");
ExpandedSubBlockEnd.gif  }

InBlock.gif  
public void AsyncTask(object state)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    
// call across network
InBlock.gif    
// assign data retreive to m_Data field
InBlock.gif
    m_ AsyncWorkComplete = true;
ExpandedSubBlockEnd.gif  }

ExpandedBlockEnd.gif}


另外,你还可以在Sharepoint Customization这个网站上找到一个实现的更精巧的例子Asynchronous Web Part Sample”。

还有最后一点没有被我遗忘,Cache。使用Cache保存数据和请求的外部对象。使用合理的序列化保存WebPart的用户定义参数。这一点对所有的ASP.NET应用都是有效的提速方案。

没有力气再向下写了,就算一个RC1的版本吧J,贴出来给大家砸,欢迎补充,欢迎指正。

转载于:https://www.cnblogs.com/Microtoby/archive/2004/12/09/75040.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值