C#网站生成静态页面的实例讲解
在一些需要经常更新页面数据的网站中,一般访问量不是很大的都直接发布的是带后台代码,每次访问都是有数据库交互的。但是一旦访问量增加了,那么这些服务器开销变成本就要考虑进来了,像一些文章,后台编辑后,文章内容存入数据库,如果1000人访问,如果还是每次取数据库,那这1000次的io访问就显得比较大了,一个好的方法就是,文章确定之后,做成静态页面,而这个做的方法由程序来做,就是递归遍历整个网站,将网站内容都访问一遍,然后生成这些页面的静态文本页面,在将这些页面发布,这样对浏览者而言,他看到的还是同一个地址,同一份文章,只是这份是静态的而言。这样就提升了网站的效率节约了资源;
下面附上一份C#遍历网站内容,然后生成内容页面代码:
privateArrayListhtmlCreatedList=newArrayList(); //////递归实现页面静态化功能 /// ///要访问的页面链接地址 publicvoidSaveHtmlCode(stringurlString) { if(htmlCreatedList.Contains(urlString)) { return; } stringhtmlCode=GetHtmlCodeFromUrl(urlString); stringhtmlPath=urlString.ToPhysicalPath(); stringdirecHtmlPath=Path.GetDirectoryName(htmlPath); if(!Directory.Exists(direcHtmlPath)) { Directory.CreateDirectory(direcHtmlPath); } File.WriteAllText(htmlPath,htmlCode); htmlCreatedList.Add(urlString); varurlList=GetUrlLinkFromHtmlCode(htmlCode); stringurlTemp=string.Empty; foreach(stringurlinurlList) { urlTemp=url; urlTemp=Regex.Replace(urlTemp,"href\\s*=\\s*",""); urlTemp=urlTemp.Replace("\"",""); urlTemp=urlTemp.Replace("\\","/"); urlTemp=WebConfigInfo.UrlPrefix+urlTemp; SaveHtmlCode(urlTemp); } } /// ///通过HttpWebRequest页面链接的html代码 /// ///页面链接地址 /// 页面链接对应的html代码 privatestringGetHtmlCodeFromUrl(stringurlString) { HttpWebRequesthwRequest=(HttpWebRequest)WebRequest.Create(urlString); hwRequest.UserAgent="User-Agent:Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.2;.NETCLR1.0.3705"; hwRequest.Accept="*/*"; hwRequest.KeepAlive=true; hwRequest.Headers.Add("Accept-Language","zh-cn,en-us;q=0.5"); HttpWebResponsehwResponse=(HttpWebResponse)hwRequest.GetResponse(); StreamstreamResponse=hwResponse.GetResponseStream(); StreamReaderreaderOfStream=newStreamReader(streamResponse,System.Text.Encoding.GetEncoding("utf-8")); stringstrHtml=readerOfStream.ReadToEnd(); readerOfStream.Close(); streamResponse.Close(); hwResponse.Close(); returnstrHtml; } //////正则表达式匹配出html代码中的超链接 /// ///要找出超链接的html代码 /// privateIEnumerable GetUrlLinkFromHtmlCode(stringhtmlCode) { stringstrRegex="href\\s*=\\s*(?:[\"'](?<1>[^\"'.#:]*)[\"'])"; Regexr=newRegex(strRegex,RegexOptions.IgnoreCase); MatchCollectionms=r.Matches(htmlCode); IEnumerable listUrl=fromMatchccinmsselectcc.ToString().Replace("&","&"); returnlistUrl.Distinct(); } }
给string扩展了一个方法。
publicstaticstringToPhysicalPath(thisstringurlString) { System.Uriuri=newSystem.Uri(urlString); stringhtmlPath=string.Format("{0}\\Html\\{1}\\",System.Web.HttpContext.Current.Request.PhysicalApplicationPath,uri.AbsolutePath); string[]querys=uri.Query.Split(newchar[]{'?','&','='},StringSplitOptions.RemoveEmptyEntries); htmlPath+=string.Join(string.Empty,querys); htmlPath+=querys.Length.Equals(0)?"Index.html":".html"; htmlPath=htmlPath.Replace("/","\\"); htmlPath=htmlPath.Replace("\\\\","\\"); returnhtmlPath; }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接