• Url地址重写,利用HttpHander手工编译页面并按需生成静态HTML文件


    作者:武眉博 

    另:建议阅读一下 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#代码
    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;   
                }   
            }  

  • 相关阅读:
    LG P4284 [SHOI2014]概率充电器
    LG P2592 [ZJOI2008]生日聚会
    LG P4953 [USACO02FEB]Cow Cycling
    LG P2389 电脑班的裁员
    LG P2344 [USACO11FEB]Generic Cow Protests G
    前端简历
    前端面试题目
    大前端的技术栈
    前端 -为什么要清楚浮动?
    Redis的功能实现
  • 原文地址:https://www.cnblogs.com/VinC/p/1991087.html
Copyright © 2020-2023  润新知