欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#网站生成静态页面的实例讲解

程序员文章站 2023-11-27 10:30:34
在一些需要经常更新页面数据的网站中,一般访问量不是很大的都直接发布的是带后台代码,每次访问都是有数据库交互的。但是一旦访问量增加了,那么这些服务器开销变成本就要考虑进来了,...

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

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

private arraylist htmlcreatedlist = new arraylist();
    /// <summary>
    /// 递归实现页面静态化功能
    /// </summary>
    /// <param name="urlstring">要访问的页面链接地址</param>
    public void savehtmlcode(string urlstring)
    {
      if (htmlcreatedlist.contains(urlstring))
      {
        return;
      }
      string htmlcode = gethtmlcodefromurl(urlstring);
      string htmlpath = urlstring.tophysicalpath();
      string direchtmlpath = path.getdirectoryname(htmlpath);
      if (!directory.exists(direchtmlpath))
      {
        directory.createdirectory(direchtmlpath);
      }
      file.writealltext(htmlpath, htmlcode);
      htmlcreatedlist.add(urlstring);
      var urllist = geturllinkfromhtmlcode(htmlcode);
      string urltemp = string.empty;
      foreach (string url in urllist)
      {
        urltemp = url;
        urltemp = regex.replace(urltemp, "href\\s*=\\s*", "");
        urltemp = urltemp.replace("\"", "");
        urltemp = urltemp.replace("\\", "/");
        urltemp = webconfiginfo.urlprefix + urltemp;
        savehtmlcode(urltemp);
      }
    }
    /// <summary>
    /// 通过httpwebrequest页面链接的html代码
    /// </summary>
    /// <param name="urlstring">页面链接地址</param>
    /// <returns>页面链接对应的html代码</returns>
    private string gethtmlcodefromurl(string urlstring)
    {
      httpwebrequest hwrequest = (httpwebrequest)webrequest.create(urlstring);
      hwrequest.useragent = "user-agent:mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; .net clr 1.0.3705";
      hwrequest.accept = "*/*";
      hwrequest.keepalive = true;
      hwrequest.headers.add("accept-language", "zh-cn,en-us;q=0.5");
      httpwebresponse hwresponse = (httpwebresponse)hwrequest.getresponse();
      stream streamresponse = hwresponse.getresponsestream();
      streamreader readerofstream = new streamreader(streamresponse, system.text.encoding.getencoding("utf-8"));
      string strhtml = readerofstream.readtoend();
      readerofstream.close();
      streamresponse.close();
      hwresponse.close();
      return strhtml;
    }
    ///<summary>
    ///正则表达式匹配出html代码中的超链接
    ///</summary>
    ///<param name="htmlcode">要找出超链接的html代码</param>
    ///<returns></returns>
    private ienumerable<string> geturllinkfromhtmlcode(string htmlcode)
    {
      string strregex = "href\\s*=\\s*(?:[\"'](?<1>[^\"'.#:]*)[\"'])";
      regex r = new regex(strregex, regexoptions.ignorecase);
      matchcollection ms = r.matches(htmlcode);
      ienumerable<string> listurl = from match cc in ms select cc.tostring().replace("&", "&");
      return listurl.distinct();
    }
  }

给string 扩展了一个方法。

public static string tophysicalpath(this string urlstring)
    {
      system.uri uri = new system.uri(urlstring);
      string htmlpath = string.format("{0}\\html\\{1}\\", system.web.httpcontext.current.request.physicalapplicationpath, uri.absolutepath);
      string[] querys = uri.query.split(new char[] { '?', '&', '=' }, stringsplitoptions.removeemptyentries);
      htmlpath += string.join(string.empty, querys);
      htmlpath += querys.length.equals(0) ? "index.html" : ".html";
      htmlpath = htmlpath.replace("/", "\\");
      htmlpath = htmlpath.replace("\\\\", "\\");
      return htmlpath;
    }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接