zoukankan      html  css  js  c++  java
  • Url地址重写,利用HttpHander手工编译页面并按需生成静态HTML文件

    本文转载自:http://huobazi.aspxboy.com/2007/12/31/UrlRewriteAndHttpHanderAndMakeStaticHtmlFiles/

    很多朋友可能都讨论过ASP.NET中生成HTML的方法了,有按照模板用IO方法写文件

    有在404错误页面内生成HTML的,有在Render内保存页面输出到HTML文件的。

    今天我发一个配合Url重写利用HttpHander手工编译.aspx页面方法。

    HTML文件的方法,可按需、“定时”的生成,以减轻数据库的访问。

    声明:下面的文字是本文不可缺少的部分,转载请保留,谢谢!

    ////////////////////////////////////////////////////

    作者:武眉博<活靶子.NET>

    同时首发于:

        落伍者   && 博客园  

        开发者学院   && .Net男孩社区

    知识点:UrlRewriteIHttpModuleIHttpHander 的编写

    效果:

    http://www.devedu.com/Doc/DotNet/AspNet/default.2.aspx

    http://www.devedu.com/Doc/DotNet/AspNet/default.2.html

    思路:

    1 挂载“.aspx"的请求到自定义的Httphander内

    2 配置URL重写规则

    3 访问某.aspx文件时,在HttpHander内 根据配置确定是否应该生成

     接着...

     if(需要生成)

     {

      if(若已经生成html文件 )

      {

       if(文件并未过期)

       {

        则直接定向(Server.Transfer())。

       }

       else

       {

        删除HTML文件;

        重新编译.aspx(Page内数据库操作等等)

        生成HTML文件;

       }

      }

      else if(尚未生成文件)

      {

       生成Html。

      }

     }

     else

     {

      则编译.aspx文件

     }

    另:建议阅读一下dudu的blog中关于asp.net页面编译的讨论

    http://www.cnblogs.com/dudu/archive/2006/03/07/345107.html

    http://www.cnblogs.com/dudu/archive/2006/03/07/344351.html

    部分代码

    C#代码
    1. public 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.         }  

     
    示例项目下载:https://files.cnblogs.com/huobazi/BuildHtmlDemo.rar

  • 相关阅读:
    JS 弹窗到右下角
    datatable绑定comboBox显示数据[C#]
    ASP.NET MVC html help
    在Filter 无法跳转地址
    js清除浏览器缓存的几种方法
    htm.dropdownlist
    C# 公历转农历
    验证码 禁止输入中文
    反射实例
    使用 Daynamic 动态添加属性
  • 原文地址:https://www.cnblogs.com/myssh/p/1524030.html
Copyright © 2011-2022 走看看