使用UrlRewritingNet重写url以.html的伪静态页面后,真实的.html无法访问的解决方法

重要补充:  其实还有另外一个方法来很好地解决这个问题,使用另一种静态页面后缀即可,也就是说使用 .htm即可,这样以.htm结尾的静态页面就不再通过 aspnet_isapi.dll进行解析了,完全不需要再通过上述程序来进行HACK。

 

1、在web.config中添加以下项目

1. <compilation>
2. <buildProviders>
3. <add extension=".html" type="System.<span href="tag.php?name=Web" onclick="tagshow(event)" class="t_tag">Web</span>.Compilation.PageBuildProvider"/>
4. </buildProviders>
5. </compilation>
6. <httpHandlers>
7. <add verb="*" path="*.html" type="System.Web.UI.PageHandlerFactory"/>
8. </httpHandlers>

2、重写处理方法

01. Namespace web
02. {
03.     public class eastClass : IHttpHandler
04.     {
05.         public bool IsReusable
06.         {
07.             get { return true; }
08.         }
09.  
10.         public void ProcessRequest(HttpContext context)
11.         {
12.             Uri url = context.Request.Url;
13.             string filepath = context.Request.Url.AbsolutePath;
14.             filepath = context.<span href="tag.php?name=Server" onclick="tagshow(event)" class="t_tag">Server</span>.MapPath("\\") + filepath.Replace("/", "\\");
15.             if (File.Exists(filepath) == false)
16.             {
17.                 if (url.ToString().IndexOf("要处理的url中的关键字") > -1)
18.                 {
19.                     string uname = url.Segments[url.Segments.Length - 1];//取出带后缀<span href="tag.php?name=%CE%C4%BC%FE" onclick="tagshow(event)" class="t_tag">文件</span>名称
20.                     string id = uname.Substring(0, uname.IndexOf("."));//真实的文件名
21.                     if (id != "")
22.                         context.Response.Redirect("/xxx.aspx?id=" + id, true);//跳转
23.                 }
24.                 else
25.                 {
26.                     filepath = context.Server.MapPath("\\") + "404.htm";
27.                     string tempstr;
28.                     using (StreamReader sr = new StreamReader(filepath, Encoding.Default))
29.                     {
30.                         tempstr = sr.ReadToEnd();
31.                     }
32.                     context.Response.Write(tempstr);
33.                     context.Response.End();
34.                 }
35.             }
36.             else
37.             {
38.                 string tempstr;
39.                 using (StreamReader sr = new StreamReader(filepath, Encoding.UTF8))
40.                 {
41.                     tempstr = sr.ReadToEnd();
42.                 }
43.                 context.Response.Write(tempstr);
44.                 context.Response.End();
45.  
46.             }
47.         }
48.     }
49. }

3、充知识
buildProviders 元素定义生成提供程序的集合,这些提供程序用于在编译期间编译特定文件类型的自定义资源文件并生成代码
若要为 ASP.NET 应用程序中的某个文件类型定义自定义生成操作,必须从 BuildProvider 类派生类,在派生类中实现用于生成该文件类型的成员并为应用程序配置文件中相应的文件扩展名配置生成提供程序。

 

下面是buildProviders下add的属性信息:
属性

属性

说明

appliesTo

必选的属性。

定义要用此提供程序生成的资源文件的类型。

appliesTo
属性可以为下列可能值之一。


说明

All

指定生成提供程序在发现资源的任何位置编译资源。

Code

指定生成提供程序只编译 App_Code 目录中的资源。

Resources

指定生成提供程序只编译 App_GlobalResources 目录中的资源。

Web

指定生成提供程序只编译 Web-content 目录中的资源。

默认值为 Web

extension

必选的 String 属性。

定义自定义资源文件扩展名。此属性是集合键。

默认值为空字符 ("")

type

必选的 String
属性。

定义用于编译 extension
属性指定的文件的类型和程序集。

默认值为空字符串 ("")

<httpHandlers> 设置由应用程序子目录继承。
<add> 指令按由上而下的顺序进行处理。如果两个或多个 <add> 元素指定相同的谓词/路径组合,则最后一个 <add> 会重写其他所有元素。

注意
Microsoft Internet 信息服务 (IIS) 有自己的 ISAPI 映射扩展模型。为使给定应用程序扩展与其处理程序之间的映射生效,该扩展必须在 IIS 中映射为 ASP.NET ISAPI。对于自定义扩展等非标准扩展,则必须相应地配置 IIS。

下面是add属性信息:
属性

属性

说明

path

必选的属性。

指定路径属性可以包含单个 URL 路径或简单的通配符字符串(如 *.aspx)。

type

必选的属性。

指定逗号分隔的类/程序集组合。ASP.NET 首先在应用程序的专用 \bin 目录中搜索程序集 DLL,然后在系统程序集缓存中搜索程序集 DLL

verb

必选的属性。

指定谓词列表可以是逗号分隔的 HTTP 谓词列表(例如,"GET, PUT, POST"),也可以是开始脚本映射(如星号

  • 通配符)。

    validate

    可选的属性。

    如果为 false,则 ASP.NET 在实际匹配请求到达之前将不尝试加载该类。这有可能延迟错误,但减少了启动时间。

    示例
    下面的代码示例演示如何将对文件扩展名为 .New 的文件的所有 HTTP 请求映射到类 MyHandler.New,将对文件扩展名为 .MyNewFileExtension 的文件的 HTTP GET 和 HEAD 请求映射到类 MyHandler.MNFEHandler.这两个类都在文件 MyHandler.dll 的程序集 MyHandler 中。

    01. <configuration>
    02.    <system.web>
    03.       <httpHandlers>
    04.          <add verb="*"
    05.               path="*.New"
    06.               type="MyHandler.New,MyHandler"/>
    07.          <add verb="GET,HEAD"
    08.               path="*.MyNewFileExtension"
    09.               type="MyHandler.MNFEHandler,MyHandler.dll"/>
    10.      </httpHandlers>
    11.    <system.web>
    12. </configuration>


    重要补充:  其实还有另外一个方法来很好地解决这个问题,使用另一种静态页面后缀即可,也就是说使用 .htm即可,这样以.htm结尾的静态页面就不再通过 aspnet_isapi.dll进行解析了,完全不需要再通过上述程序来进行HACK。

    http://www.tech-q.cn/thread-6170-1-1.html

    你可能感兴趣的:(html)