DNN站点的速度问题让我很头疼,如果用户第一次访问站点,访问时间一般是7秒左右。如果站点的应用程序池被IIS
回收了,要重新编译,时间一般是10到15秒。当然打开以后再访问,由于不需要再次编译并且相关js和css文件都缓存到了
客户端,时间在1.5秒左右。
悲催的是,我的站点大部分时间都没人访问,应用程序池被IIS回收了,好不容易有个用户访问还得现编译,大部分人
都等不了10几秒就把窗口关了。
幸亏我的站点是个人博客,无所谓。不过前几天帮朋友做了一个企业网站,这可不是小问题了啊。
冥思苦想终于找到了解决办法。下面从俩方面阐述:
1、IIS应用程序池的回收问题
这是大部分ASP.NET站点的通病,第一次访问都很慢,不过大网站由于不断的有用户访问,不至于被IIS回收了,但小
网站就不行了。
网上的解决办法是在Global.asax文件里的事件里加一个缓存对象,当缓存对象到期时执行回调函数访问本站点。效果
是每隔一段事件网站就被访问一次,不至于被IIS回收了。
其实DNN本身就有调度机制,只需要实现DotNetNuke.Services.Scheduling.SchedulerClient抽象类,然后配置
一下就可以实现每隔一段时间访问一下自己网站的效果。
在DoWork方法中进行具体的操作,代码如下:
public override void DoWork() { try { System.Net.WebClient client = new System.Net.WebClient(); byte[] result = client.DownloadData(ScheduleHistoryItem.ObjectDependencies); ScheduleHistoryItem.Succeeded = true; } catch (Exception exc) { ScheduleHistoryItem.Succeeded = false; ScheduleHistoryItem.AddLogNote("访问页面"+ScheduleHistoryItem.ObjectDependencies+"失败!" + exc); //OPTIONAL Errored(ref exc); } }
这个功能实现起来比较简单,就不细说了,完整的源代码和配置方法在这个页面http://www.icommon.net/DNNDownload.aspx
2、首页资源的下载问题
在这里我没有对整个站点的资源进行优化,只是对首页进行了优化。我觉得如果首页打开特别慢的话用户会觉得站点出
问题了,就直接关了。如果首页很 快就打开了,其他页面慢点也没那么大影响,至少说明站点没有问题。DNN的特点是只
要客户端打开过一个页面下载过一次js和css了,打开其他页面就会快 很多了。
我的方法是将首页静态化,将aspx页面里的内容转换成htm页面。
理想的情况是使用调度程序每隔一段时间将aspx类型的首页的内容转到一个静态文件里面。
先介绍一下怎么手动改吧:
首先打开首页,我的首页地址是home.aspx,在浏览器窗口右键查看源文件,复制出来,然后将里面的没有用的都删
掉。我发现里面的js没有 任何作用,于是都删了,页面大小从600k变为90k。将这个文件保存成htm文件,传到主机空
间。访问一下,和aspx的首页页面没有任何区别。你可以 对比一下我那两个页面www.icommon.net/default.htm 和www.icommon.net/home.aspx 。
下面是设置首页地址。如果你的DNN站点只有一个门户,就很简单了,在主机提供商的管理页面将站点的首页指向该
htm文件即可。但是,由于我的 DNN程序有两个门户在用,这样一改我的两个站点首页就变成一个了。所以还需要额外的
工作,以管理员身份进入DNN站点,添加一个页面例如叫做 index.aspx,配置这个页面为链接类型,然后配置301重定向
到刚才那个htm文件,并且设置这个index.aspx为站点的首页。这样的话, 用户输入域名后就重定向到htm文件了,而且
DNN里面的多个门户也互不影响。
通过这两方面的改造,速度有了质的飞跃,下面是百度统计工具提供的速度测试,图片中是我的另外那个DNN门户需要用作企业站点,所以重点测了一下。
模拟改造前 (home.aspx是以前的首页,在web.config加个空格,强制程序再次编译,模拟IIS回收应用程序池):
改造后:
转自博客园:http://www.cnblogs.com/icommon/archive/2012/03/29/2422521.html