上一篇提到采用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() ? "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 = ; i <= m.Count - ; i++)
{
string strNew = m[i].ToString().Replace("amp;", "");
if (!aList.Contains(strNew))
{
aList.Add(strNew);
}
}
return aList;
}
}

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

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

    上一篇有提到利用IHttpModule和ResultFilter实现页面静态化功能.后来经过一些改动,将ResultFilter中要实现的功能全部转移到IHttpModule中来实现 Asp.Net ...

  2. Asp.Net MVC页面静态化功能实现一:利用IHttpModule和ResultFilter

    由于公司现在所采用的是一套CMS内容管理系统的框架,所以最近项目中有一个需求提到要求实现页面静态化的功能.在网上查询了一些资料和文献,最后采用的是小尾鱼的池塘提供的 利用ResultFilter实现a ...

  3. ASP.NET MVC 页面静态化操作的思路

    本文主要讲述了在asp.net mvc中,页面静态化的几种思路和方法.对于网站来说,生成纯html静态页面除了有利于seo外,还可以减轻网站的负载能力和提高网站性能.在asp.net mvc中,视图的 ...

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

    为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...

  5. Asp.net Mvc 页面静态化

    http://www.cnblogs.com/gowhy/archive/2013/01/01/2841472.html

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

    Asp.net动态页面静态化之初始NVelocity模板引擎 静态页面是网页的代码都在页面中,不须要运行asp,php,jsp,.net等程序生成client网页代码的网页,静态页面网址中一般不含&q ...

  7. MVC页面静态化

    MVC 页面静态化   最近工作需要,实现页面静态化,以前在ASP时代,都是FSO自己手动生成的. 新时代,MVC了,当然也要新技术,网上一搜,找到一种解决方案,是基于MVC3的,实现原理是通过mvc ...

  8. MVC 页面静态化

    最近工作需要,实现页面静态化,以前在ASP时代,都是FSO自己手动生成的. 新时代,MVC了,当然也要新技术,网上一搜,找到一种解决方案,是基于MVC3的,实现原理是通过mvc提供的过滤器扩展点实现页 ...

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

    为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...

随机推荐

  1. 我异常-VS2012“System.AccessViolationException: 试图读取或写入保护内存。”

       我的系统是win7 64位 系统 安装的是 Visual studio 2012.从SVN上下载了源代码.一个B/S的系统.能正常载入登陆页,但在输入登录信息要登录的时候,就报错了:     - ...

  2. MTK6572横屏的调试过程

    电视剧集:系统MTK缺省的系统源代码,Phone模式.底部有三个虚拟按键.需求为,设置成默认横屏,设定一个合理的虚拟按键方案. ------------------------------------ ...

  3. 由于抽签HT For Web ComboBox下拉框组件

    传统HTML5的下拉框select仅仅能实现简单的文字下拉列表,而HT for Web通用组件中ComboBox不仅可以实现传统HTML5下拉框效果,并且可以在文本框和下拉列表中加入自己定义的小图标, ...

  4. iOS:删除小程序

    //Applet的批次从父视图中移除 NSArray *subViews = [_scrollView subviews]; if([subViews count] != 0) { [subViews ...

  5. android浏览器开发小技巧集锦(转)

    本人和朋友们做了一段时间浏览器,将一些小技巧分享出来,先写一部分,慢慢写,同时也为我们的浏览器打打广告 我们的浏览器将要上线,名叫沙发浏览 1.网页内的右键菜单 public boolean onLo ...

  6. ASP.NET——两个下拉框来实现动态联动

    介绍: 在网页中.我们常常会遇到下图中的情况.首先在下拉框中选择所在的省.选择之后,第二个下拉框会自己主动载入出该省中的市.这样设计极大的方便了用户的查找.那这是怎样实现的呢? 1.建立数据库 &qu ...

  7. Android apk file

    apk file 事实上zip文件. 您可以使用unzip命令提取. unzip example1.apk -d ./example_dir tree . ├── AndroidManifest.xm ...

  8. 都能看懂的嵌入式linux/android alsa_aplay alsa_amixer命令行使用方法

    前几天在嵌入式linux上用到alsa command,网上查的资料多不给力,仅仅有动手一点点查,最终能够用了,将这个用法告诉大家,以免大家少走弯路. 0.先查看系统支持哪几个alsa cmd: ll ...

  9. spring4.2完整web项目(使用html视图解析器)

    完整配置springmvc4,最终视图选择的是html,非静态文件. 最近自己配置spring的时候,遇到很多问题,由于开发环境和版本的变化导致网友们给出的建议很多还是不能用的,可能还会有很多人会遇到 ...

  10. wcf系列5天速成——第一天 binding的使用(1)

    原文:wcf系列5天速成--第一天 binding的使用(1) 作为WCF速成系列,只介绍些项目开发中常用到的实战知识. 学习wcf,还是对其中的几个术语要了解一下.wcf中有一个ABC的概念,就是 ...