Asp.Net MVC页面静态化功能实现二:用递归算法来实现

上一篇提到采用IHttpModule来实现当用户访问网站的时候,通过重新定义Response.Filter来实现将返回给客户端的html代码保存,以便用户下一次访问是直接访问静态页面。

Asp.Net MVC页面静态化功能实现一:利用IHttpModule,摒弃ResultFilter

后来想到可以通过WebRequest获取html代码,然后采用递归算法来实现。基本实现思路如下:

通过WebRequest获取超链接地址返回的html代码,并保存;通过正则表达式匹配html代码中所有的超链接href=""里面地址信息; 循坏超链接地址,然后再递归WebRequest获取html代码

实现代码如下:

public class HtmlPageHelper
{
    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 = GetHtmlPathFromUrl(urlString);
            string direcHtmlPath = Path.GetDirectoryName(htmlPath);
            if (!Directory.Exists(direcHtmlPath))
            {
                Directory.CreateDirectory(direcHtmlPath);
            }
            File.WriteAllText(htmlPath, htmlCode);
            htmlCreatedList.Add(urlString);

            ArrayList 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>
    /// 分析页面链接地址,生成静态页面保存的物理路径
    /// </summary>
    /// <param name="urlString">页面链接地址</param>
    /// <returns>静态页面保存的物理路径</returns>
    private string GetHtmlPathFromUrl(string urlString)
        {
            Uri uri = new Uri(urlString);
            string filePath = HttpContext.Current.Request.PhysicalApplicationPath + "Html" + uri.AbsolutePath + "\\";
            string[] querys = uri.Query.Split(new char[] { ‘?‘, ‘&‘, ‘=‘ }, StringSplitOptions.RemoveEmptyEntries);
            foreach (string query in querys)
            {
                filePath += query;
            }
            filePath += querys.Length.Equals(0) ? "Index.html" : ".html";
            filePath = filePath.Replace("/", "\\");
            filePath = filePath.Replace("\\\\", "\\");
            return filePath;
        }

    /// <summary>
    /// 正则表达式匹配出html代码中的超链接
    /// </summary>
    /// <param name="htmlCode">要找出超链接的html代码</param>
    /// <returns></returns>
    private ArrayList GetUrlLinkFromHtmlCode(string htmlCode)
        {
            ArrayList aList = new ArrayList();
            string strRegex = "href\\s*=\\s*(?:[\"‘](?<1>[^\"‘.#:]*)[\"‘])";
            Regex r = new Regex(strRegex, RegexOptions.IgnoreCase);
            MatchCollection m = r.Matches(htmlCode);
            for (int i = 0; i <= m.Count - 1; i++)
            {
                string strNew = m[i].ToString().Replace("amp;", "");
                if (!aList.Contains(strNew))
                {
                    aList.Add(strNew);
                }
            }
            return aList;
        }
}
时间: 2024-08-06 07:31:30

Asp.Net MVC页面静态化功能实现二:用递归算法来实现的相关文章

利用ResultFilter实现asp.net mvc 页面静态化

为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容的文本保存,直接上代码: public class StaticFileWriteFilterAttribute : FilterAttribute, IResultFilter { public void OnResultExecuted(ResultExecutedContext filterC

Asp.net动态页面静态化之初始NVelocity模板引擎

Asp.net动态页面静态化之初始NVelocity模板引擎 静态页面是网页的代码都在页面中,不须要运行asp,php,jsp,.net等程序生成client网页代码的网页,静态页面网址中一般不含"?"."="."&"等特殊符号. 静态页面不能自主管理公布更新的页面,假设想更新网页内容,要通过FTP软件把文件DOWN下来用网页制作软件改动(通过fso等技术例外) 常见的静态页面举例:.html扩展名的..htm扩展名的. 注意:静态页面并

Asp.net动态页面静态化之字典哈希表的输出已及遍历判断的实现

Asp.net动态页面静态化之字典哈希表的输出已经遍历判断的实现 using System; using System.Collections.Generic; using System.Linq; using System.Web; using NVelocity.Runtime; using NVelocity; using NVelocity.App; using System.Collections; namespace czbk { /// <summary> /// diction

利用ResultFilter实现asp.net mvc3 页面静态化

为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容的文本保存,直接上代码: 1 public class StaticFileWriteFilterAttribute : FilterAttribute, IResultFilter 2 { 3 public void OnResultExecuted(ResultExecutedContext f

Asp.net动态页面静态化之include和parse区别

Asp.net动态页面静态化之include和parse区别    #include就是在模版中在将其他模版包括进来,就好比网站的头部,尾部,广告模版等等,这些内容都是相同的时候,就可以做成一个单独的模版供各处引用. #parse的用法跟#include相类似,如果将上面的代码改成#parse之后,效果是一样的,#parse的特殊功能在于,它可以解析Nvelocity元素,比如,body.html 模版使用Nvelocity变量 $body ,如果使用#parse引用head.html和foot

Asp.net动态页面静态化之输出对象属性(实体关联)

Asp.net动态页面静态化之输出对象属性(实体关联) 模板引擎不单单可以输出单一的数据,还能直接输出对象的属性 using System; using System.Collections.Generic; using System.Linq; using System.Web; using NVelocity.Runtime; using NVelocity; using NVelocity.App; namespace czbk { /// <summary> /// Handler2

基于 ThinkPHP 3.2.3 的页面静态化功能的实现

PHP 的页面静态化有多种实现方式,比如使用输出缓冲(output buffering),该种方式是把数据缓存在 PHP 的缓冲区(内存)中,下一次取数据时直接从缓冲区中读取数据,从而避免了脚本的编译和访问数据库等过程:另一种方式是直接生成静态的 HTML 文件,使用文件读写函数来实现,一些内容不经常改动的页面可以使用静态页面,访客访问到的页面就是真实的 HTML 页面,一些常见的 CMS 会使用该种方法. 以第二种方法为例,参考 DedeCMS 5.7 的静态化功能,在 ThinkPHP 3.

C# MVC 页面静态化导致的问题

在设置页面静态化的路由,代码如 //静态路由 routes.MapRoute( name: "html", url: "{controller}/{action}.html", defaults: new { controller = "Main" , action = "Index" } ); 需要将静态的html文件处理程序映射到aspnet_isapi.dll处理. 可以在IIS中添加如图: 也可以在web.Config

Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化

模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则.强大的功能.高效的渲染效率.详尽的帮助说明与不断的更新与维护.常见的前端模板引擎有: 常用的java后台模板引擎:jsp.FreeMarker.Velocity等. 请不要迷恋速度,为了推广的测试可能是片面的,好的模板引擎经得起时间考验,建议大家选择成熟的.常用的模板引擎.另外不管前后端的模板引擎