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

    很多朋友可能都讨论过ASP.NET中生成HTML的方法了,有按照模板用IO方法写文件
    有在404错误页面内生成HTML的,有在Render内保存页面输出到HTML文件的。
    今天我发一个配合Url重写利用HttpHander手工编译.aspx页面方法。
    HTML文件的方法,可按需、“定时”的生成,以减轻数据库的访问。
    声明:下面的文字是本文不可缺少的部分,转载请保留,谢谢!
    ////////////////////////////////////////////////////
    作者:武眉博<活靶子.NET> 
    同时首发于:
        落伍者  && 博客园  
        开发者学院  && .Net男孩社区
    知识点:UrlRewrite、 IHttpModule、 IHttpHander 的编写
    效果:
    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
    部分代码:

    public void ProcessRequest(HttpContext context)
            {
                string rawUrl = context.Request.RawUrl;
                string requestPath = context.Request.Path;
                string applicationPath = context.Request.ApplicationPath;
                Url urlItem = null;
                //上下文中没有定义ToStaticUrlItem表示,此请求没有经过UrlRewrite,直接编译,不生成html
                //参考UrlRewriteModule.cs
                if (context.Items["ToStaticUrlItem"] == null)
                {
                    if (!File.Exists(context.Request.PhysicalPath))
                    {
                        throw new HttpException(404, "您访问的页面没有找到。");
                    }
                    // asp.net 1.1 采用下面方法编译页面
                    //PageParser.GetCompiledPageInstance(requestPath, context.Request.PhysicalPath, context).ProcessRequest(context);
                    IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(requestPath, typeof(Page)) as IHttpHandler;
                    hander.ProcessRequest(context);
                    return;
                }
                string filePath;
                urlItem = (Url)context.Items["ToStaticUrlItem"];
                Regex regex = new Regex(
                    Globals.ApplicationPath + urlItem.LookFor,
                    RegexOptions.CultureInvariant | RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
                string requestFile = regex.Replace(rawUrl, Globals.ApplicationPath + urlItem.WriteTo.Replace("^", "&"));
                if (requestFile.IndexOf("?") > 0)
                {
                    filePath = requestFile.Substring(0, requestFile.IndexOf("?"));
                }
                else
                {
                    filePath = requestFile;
                }
                string inputFile = context.Request.PhysicalApplicationPath + filePath;
                string path = context.Request.PhysicalApplicationPath + rawUrl.ToLower().Replace(".aspx", ".html");
                if (applicationPath != "/")
                {
                    inputFile = inputFile.Replace(applicationPath + "/", @"\");
                    path = path.Replace(applicationPath + "/", "").Replace("/", @"\");
                }
                else
                {
                    path = path.Replace("/", @"\");
                }
                if (!urlItem.EnabledToStatic)
                {
                    // asp.net 1.1 采用下面方法编译页面
                    //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context );
                    IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler;
                    hander.ProcessRequest(context);
                    return;
                }
                if (!File.Exists(path))
                {
                    // asp.net 1.1 采用下面方法编译页面
                    //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context );
                    IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler;
                    hander.ProcessRequest(context);
                    context.Response.Filter = new AspxBoy.BuildHtmlDemo.ToHtmlFilter(context.Response.Filter, path);
                    return;
                }
                if (urlItem.Minutes == Int32.MaxValue)
                {
                    context.Server.Transfer(rawUrl.ToLower().Replace(".aspx", ".html"));
                }
                else
                {
                    FileInfo fileInfo = new FileInfo(path);
                    if (fileInfo.LastWriteTime.AddMinutes((double)urlItem.Minutes) < DateTime.Now)
                    {
                        fileInfo.Delete();
                        // asp.net 1.1 采用下面方法编译页面
                        //PageParser.GetCompiledPageInstance( filePath , inputFile , context ).ProcessRequest( context );
                        IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(filePath, typeof(Page)) as IHttpHandler;
                        hander.ProcessRequest(context);
                        context.Response.Filter = new AspxBoy.BuildHtmlDemo.ToHtmlFilter(context.Response.Filter, path);
                    }
                    else
                    {
                        context.Server.Transfer(rawUrl.ToLower().Replace(".aspx", ".html"));
                    }
                    return;
                }
            }
  • 相关阅读:
    Unity3D 学习笔记
    Python中os和sys模块
    合并两个排序的链表
    反转链表 难
    链表中倒数第k个结点
    调整数组顺序使奇数在偶数前 14
    javascript中this详解
    静态方法实例方法
    强制类型转换
    javascript类型判断方法
  • 原文地址:https://www.cnblogs.com/answercard/p/1393603.html
Copyright © 2011-2022 走看看