Url地址重写,利用HttpHander手工编译页面并按需生成静态HTML文件
很多朋友可能都讨论过ASP.NET中生成HTML的方法了,有按照模板用IO方法写文件
有在404错误页面内生成HTML的,有在Render内保存页面输出到HTML文件的。
今天我发一个配合Url重写利用HttpHander手工编译.aspx页面方法。
HTML文件的方法,可按需、“定时”的生成,以减轻数据库的访问。
有在404错误页面内生成HTML的,有在Render内保存页面输出到HTML文件的。
今天我发一个配合Url重写利用HttpHander手工编译.aspx页面方法。
HTML文件的方法,可按需、“定时”的生成,以减轻数据库的访问。
声明:下面的文字是本文不可缺少的部分,转载请保留,谢谢!
////////////////////////////////////////////////////
知识点:UrlRewrite、 IHttpModule、 IHttpHander 的编写
思路:
1 挂载“.aspx"的请求到自定义的Httphander内
2 配置URL重写规则
3 访问某.aspx文件时,在HttpHander内 根据配置确定是否应该生成
接着...
if(需要生成)
{
if(若已经生成html文件 )
{
if(文件并未过期)
{
则直接定向(Server.Transfer())。
}
else
{
删除HTML文件;
重新编译.aspx(Page内数据库操作等等)
生成HTML文件;
}
}
else if(尚未生成文件)
{
生成Html。
}
}
else
{
则编译.aspx文件
}
1public void ProcessRequest(HttpContext context)
2 {
3 string rawUrl = context.Request.RawUrl;
4 string requestPath = context.Request.Path;
5 string applicationPath = context.Request.ApplicationPath;
6 Url urlItem = null;
7
8 //上下文中没有定义ToStaticUrlItem表示,此请求没有经过UrlRewrite,直接编译,不生成html
9 //参考UrlRewriteModule.cs
10 if (context.Items["ToStaticUrlItem"] == null)
11 {
12 if (!File.Exists(context.Request.PhysicalPath))
13 {
14 throw new HttpException(404, "您访问的页面没有找到。");
15 }
16
17 // asp.net 1.1 采用下面方法编译页面
18 //PageParser.GetCompiledPageInstance(requestPath, context.Request.PhysicalPath, context).ProcessRequest(context);
19 IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(requestPath, typeof(Page)) as IHttpHandler;
20 hander.ProcessRequest(context);
21
22 return;
23 }
24
25 string filePath;
26
27 urlItem = (Url)context.Items["ToStaticUrlItem"];
28
29 Regex regex = new Regex(
30 Globals.ApplicationPath + urlItem.LookFor,
31 RegexOptions.CultureInvariant | RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
32
33 string requestFile = regex.Replace(rawUrl, Globals.ApplicationPath + urlItem.WriteTo.Replace("^", "&"));
34
35 if (requestFile.IndexOf("?") > 0)
36 {
37 filePath = requestFile.Substring(0, requestFile.IndexOf("?"));
38 }
39 else
40 {
41 filePath = requestFile;
42 }
43
44 string inputFile = context.Request.PhysicalApplicationPath + filePath;
45 string path = context.Request.PhysicalApplicationPath + rawUrl.ToLower().Replace(".aspx", ".html");
46 if (applicationPath != "/")
47 {
48 inputFile = inputFile.Replace(applicationPath + "/", @"\");
49 path = path.Replace(applicationPath + "/", "").Replace("/", @"\");
50 }
51 else
52 {
53 path = path.Replace("/", @"\");
54 }
55
56 if (!urlItem.EnabledToStatic)
57 {
58 // asp.net 1.1 采用下面方法编译页面
59 //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context );
60 IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler;
61 hander.ProcessRequest(context);
62
63 return;
64 }
65
66 if (!File.Exists(path))
67 {
68 // asp.net 1.1 采用下面方法编译页面
69 //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context );
70 IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler;
71 hander.ProcessRequest(context);
72 context.Response.Filter = new AspxBoy.BuildHtmlDemo.ToHtmlFilter(context.Response.Filter, path);
73
74 return;
75 }
76
77 if (urlItem.Minutes == Int32.MaxValue)
78 {
79 context.Server.Transfer(rawUrl.ToLower().Replace(".aspx", ".html"));
80 }
81 else
82 {
83 FileInfo fileInfo = new FileInfo(path);
84 if (fileInfo.LastWriteTime.AddMinutes((double)urlItem.Minutes) < DateTime.Now)
85 {
86 fileInfo.Delete();
87
88 // asp.net 1.1 采用下面方法编译页面
89 //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context );
90 IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler;
91 hander.ProcessRequest(context);
92 context.Response.Filter = new AspxBoy.BuildHtmlDemo.ToHtmlFilter(context.Response.Filter, path);
93 }
94 else
95 {
96 context.Server.Transfer(rawUrl.ToLower().Replace(".aspx", ".html"));
97 }
98 return;
99 }
100 }
101
2 {
3 string rawUrl = context.Request.RawUrl;
4 string requestPath = context.Request.Path;
5 string applicationPath = context.Request.ApplicationPath;
6 Url urlItem = null;
7
8 //上下文中没有定义ToStaticUrlItem表示,此请求没有经过UrlRewrite,直接编译,不生成html
9 //参考UrlRewriteModule.cs
10 if (context.Items["ToStaticUrlItem"] == null)
11 {
12 if (!File.Exists(context.Request.PhysicalPath))
13 {
14 throw new HttpException(404, "您访问的页面没有找到。");
15 }
16
17 // asp.net 1.1 采用下面方法编译页面
18 //PageParser.GetCompiledPageInstance(requestPath, context.Request.PhysicalPath, context).ProcessRequest(context);
19 IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(requestPath, typeof(Page)) as IHttpHandler;
20 hander.ProcessRequest(context);
21
22 return;
23 }
24
25 string filePath;
26
27 urlItem = (Url)context.Items["ToStaticUrlItem"];
28
29 Regex regex = new Regex(
30 Globals.ApplicationPath + urlItem.LookFor,
31 RegexOptions.CultureInvariant | RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
32
33 string requestFile = regex.Replace(rawUrl, Globals.ApplicationPath + urlItem.WriteTo.Replace("^", "&"));
34
35 if (requestFile.IndexOf("?") > 0)
36 {
37 filePath = requestFile.Substring(0, requestFile.IndexOf("?"));
38 }
39 else
40 {
41 filePath = requestFile;
42 }
43
44 string inputFile = context.Request.PhysicalApplicationPath + filePath;
45 string path = context.Request.PhysicalApplicationPath + rawUrl.ToLower().Replace(".aspx", ".html");
46 if (applicationPath != "/")
47 {
48 inputFile = inputFile.Replace(applicationPath + "/", @"\");
49 path = path.Replace(applicationPath + "/", "").Replace("/", @"\");
50 }
51 else
52 {
53 path = path.Replace("/", @"\");
54 }
55
56 if (!urlItem.EnabledToStatic)
57 {
58 // asp.net 1.1 采用下面方法编译页面
59 //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context );
60 IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler;
61 hander.ProcessRequest(context);
62
63 return;
64 }
65
66 if (!File.Exists(path))
67 {
68 // asp.net 1.1 采用下面方法编译页面
69 //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context );
70 IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler;
71 hander.ProcessRequest(context);
72 context.Response.Filter = new AspxBoy.BuildHtmlDemo.ToHtmlFilter(context.Response.Filter, path);
73
74 return;
75 }
76
77 if (urlItem.Minutes == Int32.MaxValue)
78 {
79 context.Server.Transfer(rawUrl.ToLower().Replace(".aspx", ".html"));
80 }
81 else
82 {
83 FileInfo fileInfo = new FileInfo(path);
84 if (fileInfo.LastWriteTime.AddMinutes((double)urlItem.Minutes) < DateTime.Now)
85 {
86 fileInfo.Delete();
87
88 // asp.net 1.1 采用下面方法编译页面
89 //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context );
90 IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler;
91 hander.ProcessRequest(context);
92 context.Response.Filter = new AspxBoy.BuildHtmlDemo.ToHtmlFilter(context.Response.Filter, path);
93 }
94 else
95 {
96 context.Server.Transfer(rawUrl.ToLower().Replace(".aspx", ".html"));
97 }
98 return;
99 }
100 }
101