目录
一、为什么要生成静态页面?
起因是这样的,最近买了台云服务器,奈何囊中羞涩只买得起一核、两G内存、一兆宽带一年的服务器,当我用爬虫将爬取的数据做成网站发布到上面的时候,发现尴尬了,打开首页竟然要20秒,这..........,用户肯定受不了没打开就跑完了,而且加载首页的时候,CPU竟然直接爆到了90%
这可不能忍呀,所以想到将页面静态化以节省运算时间和效率。当我实现静态化后,页面首次加载的时间基本都在3秒之内,当第二次打开有了缓存之后基本都是在1秒左右,大家可以访问我的网站首页体验一下 免费电影下载_北辰影视
这个网站所有资源都是用爬虫从互联网上爬取的,对爬虫感兴趣的同学可以参考我另一篇博文:.net爬虫使用HtmlAgilityPack爬取网络数据
二、上代码
创建生成静态页面的类和方法
public class MVCStaticPage
{
#region 生成静态内容
/// <summary>
/// 生成静态内容
/// </summary>
/// <param name="context"></param>
/// <param name="viewPath"></param>
/// <param name="model"></param>
/// <returns></returns>
public static string RenderViewToString(ControllerContext context,
string viewPath,
object model = null)
{
var paramPath = string.Empty;
var newViewpath = string.Empty;
if (viewPath.IndexOf("?")>=0)
{
paramPath=viewPath.Substring(viewPath.IndexOf("?"), viewPath.Length - viewPath.IndexOf("?"));
viewPath = viewPath.Substring(0, viewPath.IndexOf("?"));
var denghaoIndex = paramPath.IndexOf("=")+1;
var paramPathLength = paramPath.Length;
var jiequ = paramPathLength - denghaoIndex;
context.Controller.TempData.Add(paramPath.Substring(denghaoIndex, jiequ)+"-"+DateTime.Now.ToLongTimeString(),0);
}
ViewEngineResult viewEngineResult =
ViewEngines.Engines.FindView(context, viewPath, null);
if (viewEngineResult == null)
throw new FileNotFoundException("View" + viewPath + "cannot be found.");
var view = viewEngineResult.View;
context.Controller.ViewData.Model = model;
//context.Controller.ViewData.Keys.
using (var sw = new StringWriter())
{
var ctx = new ViewContext(context, view,
context.Controller.ViewData,
context.Controller.TempData,
sw); ;
view.Render(ctx, sw);
return sw.ToString();
}
}
#endregion
}
三、生成静态页面
public ActionResult TestCreatStaticHtml()
{
//这里实例化当前的controler,为了拿到其他方法中的数据,也可以直接写sql拿到list集合数据放到循环中
var testPageController = new TestPagedController();
var tagStaticPage = string.Empty;
List<string> list = new List<string>()
{
"电视剧",
"美剧",
"丧尸",
"人性",
"传记",
"冒险",
"剧情",
"动作",
"喜剧",
"奇幻",
"女权",
"恐怖",
"悬疑",
"情色",
"惊悚",
"成长",
"搞笑",
"梦想",
"武侠",
"灵异",
"烂片",
"热血",
"爱情",
"科幻",
"童话",
"限制",
"青春",
"动画",
"动漫"
};
for (int i = 0; i < list.Count; i++)
{
//这句不用管,是放到前端的类型展示
ViewBag.Search = list[i];
//下面就我要拿到Index方法中的数据,具体代码参考下一节
testPageController.Index(list[i]);
var tagPageList = testPageController.ViewBag.TagPageList;
var tagHtml = MVCStaticPage.RenderViewToString(this.ControllerContext, "~/Views/TestPaged/Index.cshtml", tagPageList);
//页面保存的路径
tagStaticPage = HttpContext.Server.MapPath("~/testtag/");
if (!Directory.Exists(tagStaticPage))
{
Directory.CreateDirectory(tagStaticPage);
}
System.IO.File.WriteAllText(tagStaticPage + list[i] + ".html", tagHtml);
System.IO.File.WriteAllText(tagStaticPage + System.Web.HttpUtility.UrlEncode(list[i]) + ".html", tagHtml);
}
Response.Write("<p>Tag已生成完毕</p>");
Response.Flush();
return View();
}
上面这句代码 testPageController.Index(list[i]),其实就是拿到下面代码的数据,这里只静态了电影类目的页面,大家可以把整站的数据拿来实例化
public ActionResult Index(string id,string page="1")
{
string tag = id;
if (string.IsNullOrEmpty(tag))
{
tag = "科幻";
}
ViewBag.Search = tag;
var moviesDate = bllMovie.GetListByPageForMySqlId(" movie_tag like '%" + tag + "%' or by_03 like '%" + tag + "%' ", " oldid desc", -1, -1).Tables[0];
var moviesDateConvertModels = bllMovie.DataTableToList(moviesDate).ToPagedList(int.Parse(page), 12);//new Common().DataSetBindList<Model.movies_tb>(movies, moviesDate);
ViewBag.TagPageList = moviesDateConvertModels;
return View(moviesDateConvertModels);
}
总结
1.创建页面静态化,可以有效减少运算时间,节省服务器内存消耗。
2.使用MVC引擎自带的静态化可以很简单的实现静态化