使用UrlRewritingNet重写url以.html的伪静态页面后,真实的.html无法访问的解决方法
时间:2010-11-05 来源:skyaspnet
1、在web.config中添加以下项目
。
view sourceprint? 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、重写处理方法
view sourceprint? 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
默认值为 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 中。
重要补充: 其实还有另外一个方法来很好地解决这个问题,使用另一种静态页面后缀即可,也就是说使用 .htm即可,这样以.htm结尾的静态页面就不再通过 aspnet_isapi.dll进行解析了,完全不需要再通过上述程序来进行HACK。
http://www.tech-q.cn/thread-6170-1-1.html