在一些需要经常更新页面数据的网站中,一般访问量不是很大的都直接发布的是带后台代码,每次访问都是有数据库交互的。但是一旦访问量增加了,那么这些服务器开销变成本就要考虑进来了,像一些文章,后台编辑后,文章内容存入数据库,如果1000人访问,如果还是每次取数据库,那这1000次的io访问就显得比较大了,一个好的方法就是,文章确定之后,做成静态页面,而这个做的方法由程序来做,就是递归遍历整个网站,将网站内容都访问一遍,然后生成这些页面的静态文本页面,在将这些页面发布,这样对浏览者而言,他看到的还是同一个地址,同一份文章,只是这份是静态的而言。这样就提升了网站的效率节约了资源;

下面附上一份C#遍历网站内容,然后生成内容页面代码;

  1. private ArrayList htmlCreatedList = new ArrayList();
  2. /// <summary>
  3. /// 递归实现页面静态化功能
  4. /// </summary>
  5. /// <param name="urlString">要访问的页面链接地址</param>
  6. public void SaveHtmlCode(string urlString)
  7. {
  8. if (htmlCreatedList.Contains(urlString))
  9. {
  10. return;
  11. }
  12. string htmlCode = GetHtmlCodeFromUrl(urlString);
  13. string htmlPath = urlString.ToPhysicalPath();
  14. string direcHtmlPath = Path.GetDirectoryName(htmlPath);
  15. if (!Directory.Exists(direcHtmlPath))
  16. {
  17. Directory.CreateDirectory(direcHtmlPath);
  18. }
  19. File.WriteAllText(htmlPath, htmlCode);
  20. htmlCreatedList.Add(urlString);
  21. var urlList = GetUrlLinkFromHtmlCode(htmlCode);
  22. string urlTemp = string.Empty;
  23. foreach (string url in urlList)
  24. {
  25. urlTemp = url;
  26. urlTemp = Regex.Replace(urlTemp, "href\\s*=\\s*", "");
  27. urlTemp = urlTemp.Replace("\"", "");
  28. urlTemp = urlTemp.Replace("\\", "/");
  29. urlTemp = WebConfigInfo.UrlPrefix + urlTemp;
  30. SaveHtmlCode(urlTemp);
  31. }
  32. }
  33. /// <summary>
  34. /// 通过HttpWebRequest页面链接的html代码
  35. /// </summary>
  36. /// <param name="urlString">页面链接地址</param>
  37. /// <returns>页面链接对应的html代码</returns>
  38. private string GetHtmlCodeFromUrl(string urlString)
  39. {
  40. HttpWebRequest hwRequest = (HttpWebRequest)WebRequest.Create(urlString);
  41. hwRequest.UserAgent = "User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705";
  42. hwRequest.Accept = "*/*";
  43. hwRequest.KeepAlive = true;
  44. hwRequest.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5");
  45. HttpWebResponse hwResponse = (HttpWebResponse)hwRequest.GetResponse();
  46. Stream streamResponse = hwResponse.GetResponseStream();
  47. StreamReader readerOfStream = new StreamReader(streamResponse, System.Text.Encoding.GetEncoding("utf-8"));
  48. string strHtml = readerOfStream.ReadToEnd();
  49. readerOfStream.Close();
  50. streamResponse.Close();
  51. hwResponse.Close();
  52. return strHtml;
  53. }
  54. ///<summary>
  55. ///正则表达式匹配出html代码中的超链接
  56. ///</summary>
  57. ///<param name="htmlCode">要找出超链接的html代码</param>
  58. ///<returns></returns>
  59. private IEnumerable<string> GetUrlLinkFromHtmlCode(string htmlCode)
  60. {
  61. string strRegex = "href\\s*=\\s*(?:[\"'](?<1>[^\"'.#:]*)[\"'])";
  62. Regex r = new Regex(strRegex, RegexOptions.IgnoreCase);
  63. MatchCollection ms = r.Matches(htmlCode);
  64. IEnumerable<string> listUrl = from Match cc in ms select cc.ToString().Replace("&", "&");
  65. return listUrl.Distinct();
  66. }
  67. }

给string 扩展了一个方法。

    1. public static string ToPhysicalPath(this string urlString)
    2. {
    3. System.Uri uri = new System.Uri(urlString);
    4. string htmlPath = string.Format("{0}\\Html\\{1}\\", System.Web.HttpContext.Current.Request.PhysicalApplicationPath, uri.AbsolutePath);
    5. string[] querys = uri.Query.Split(new char[] { '?', '&', '=' }, StringSplitOptions.RemoveEmptyEntries);
    6. htmlPath += string.Join(string.Empty, querys);
    7. htmlPath += querys.Length.Equals(0) ? "Index.html" : ".html";
    8. htmlPath = htmlPath.Replace("/", "\\");
    9. htmlPath = htmlPath.Replace("\\\\", "\\");
    10. return htmlPath;
    11. }

c# 网站生成静态页面的更多相关文章

  1. 浅谈php生成静态页面

    一.引 言 在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是由于静态页面的灵活性较差,如果不借助数据库或其他的设备保存相关信息的话,整体的管理上比较繁琐,比方修改编辑.比方阅读权 ...

  2. .net 生成 静态页面

    .net 生成 静态页面 <!--Main.Aspx--> <%@ page language="C#" %> <%@ import namespac ...

  3. C#根据网址生成静态页面

    HoverTree开源项目中HoverTreeWeb.HVTPanel的Index.aspx文件 是后台管理的首页. 包含生成留言板首页,以及显示用户名,退出等功能. 根据网址生成页面的方法: boo ...

  4. 比较详细PHP生成静态页面教程

    一,PHP脚本与动态页面. PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合, 也可以类,函数封装等形式,以模板的方式对用户请求进行处理.无论以何种方式,它的基本原理是这样的.由客 ...

  5. [转]把动态页面.aspx 生成静态页面.html

    本文转自:http://blog.csdn.net/csb5201314/article/details/5391688 如果要把主页Index.aspx 生成静态页面 Index.html后输出会提 ...

  6. PHP生成静态页面的方法

          在PHP网站开发中为了网站推广和SEO等需要,需要对网站进行全站或局部静态化处理,PHP生成静态HTML页面有多种方法,比如利用PHP模板.缓存 等实现页面静态化,今天就以PHP实例教程形 ...

  7. .NET生成静态页面例子

    主要做法如下: 1.创建网站,并创建一个模板页,template.htm 2.添加一个web窗体Default.aspx 3.在网站下新建文件夹htm,设置该文件夹的属性,确保该文件夹具有可写权限 详 ...

  8. 三种C#.net生成静态页面的方法

    ASP.NET生成静态页面方法主要有三种   第一种方法:向服务器的动态页面发送请求,获取页面的html代码.这种方法缺点显而易见:速度慢.另外如果请求的动态页面有验证控件的话,返回的html页面却无 ...

  9. Java项目生成静态页面

    第一次做项目需要生成静态页面,网上很多大牛对将网页生成静态页面有很多异议.说一下我的看法. 不外乎有以下因素: 1.从页面加载时间来看:静态页面不需要与数据库建立连接,尤其是访问数据量较大的页面,这种 ...

随机推荐

  1. MySQL中的模糊查询和通配符转义

    MySQL中实现模糊查询有2种方式:一是用LIKE/NOT LIKE,二是用REGEXP/NOT REGEXP(或RLIKE/NOT RLIKE,它们是同义词). 第一种是标准的SQL模式匹配.它有2 ...

  2. " 初窥 " nginx

    1. 无题 第一次听到Nginx这个词,还是两年前的事儿了,最近常逛CSDN,越来越频繁的接触到这个词汇,今天看了些资料,简单的总结下,作为入门. 2. 背景介绍: Nginx (发音同 engine ...

  3. VMware vCenter中, 如何辩认虚机上Raw Device Mapping过了的一块物理磁盘?

    比如说, 我们有一套VMware的环境, 其中有一台运行者ESXi的主机, 其上有十块SAS盘. 这十块盘中的五块盘被RDM到一台虚机上了. 假设你发现有添加多了一块盘, 你想移除掉, 但是5块盘其中 ...

  4. Objective-C面向对象之实现类

    一般涉及到面向对象都会C#,Java都不可避免的涉及到类,C#中类的后缀名是.cs,Java中是.java,Object-C中一般用两个文件描述一个类,后缀名为.h为类的声明文件,用于声明成员变量和方 ...

  5. C# 事件(Event)

    事件(Event) 基本上说是一个用户操作,如按键.点击.鼠标移动等等,或者是一些出现,如系统生成的通知.应用程序需要在事件发生时响应事件.例如,中断.事件是用于进程间通信. 通过事件使用委托 事件在 ...

  6. 巧妙使用div+css模拟表格对角线

    首先声明: 这只是探讨一种CSS模拟表格对角线的用法,实际在工作中可能觉得这样做有点小题大作,这不是本主题讨论的重点.如果对此深以为然的朋友,请一笑过之... 有时在插入文档时,要用到表格对角线,常见 ...

  7. Android -- 加载大图片的方法

    在android中要加载一张大图片到内存中如果通过如下方式进行: Bitmap bitmap= BitmapFactory.decodeFile("/sdcard/a.jpg"); ...

  8. python 两个队列进行对比

    python 两个队列进行对比 list01 = [1,2,3,4] list02 = [1,3,5] for i01 in list01: is_in_02 = False for i02 in l ...

  9. 用Bluepages来验证intranetId和Password的有效性

    代码很简单,如下: int ret = -1;ReturnCode rc = null;            cwa2 cw = new cwa2();rc = cw.authenticate(in ...

  10. MFC 小知识总结二

    1 UpdateData 不能及时更新控件内容 原因: UpdateData是通过数据交换实现改变控件显示的.改变了之后必需要调用一次OnPaint才干实现刷新. 因此,若是在一个函数里重复多次调用有 ...