技术开发 频道

在ASP.NET 2.0中开发通配符映射应用程序的一些问题

   【IT168 技术文档】 文章的题目想了好几个,比如:“在ASP.NET 2.0中开发通配符映射应用程序的一些问题”,后来考虑到为了吸引眼球:),并为了好记,选了这个有点俗的题目。 
    本文主要通过分析在ASP.NET 2.0中开发ASP.NET通配符映射应用程序遇到的一些问题,来说明ASP.NET 2.0中页面编译模型的不足之处。文章中如果有不妥之处,欢迎您指出。 
    这里所说的ASP.NET通配符映射应用程序是指在IIS中将所有请求转发至ASP.NET 2.0运行时处理(对于IIS 5.0,就是建立.*到aspnet_isapi.dll的映射),在程序中通过实现System.Web.IhttpHandlerFactory接口来处理所有请求,实现System.Web.IhttpHandlerFactory的类就相当于一个前端控制器。典型应用就是.Text及基于.Text开发的博客园Blog软件。 
   在ASP.NET 1.1中,实现通配符映射应用程序大家可能比较清楚,主要是两点: 
   1、 实现System.Web.IhttpHandlerFactory接口,在GetHandler(HttpContext context, string requestType, string url, string path)中根据请求的url,基于一些规则,找到实际访问的页面文件,然后调用PageParser.GetCompiledPageInstance对页面进行编译并生成相应的实例处理请求。这样做的好处是:你可以使用任意的url地址,不必关心是否存在对应的页面文件,而且可以方便地控制对Web服务器上资源的访问。 
    2、 在web.config中加上:
<httpHandlers> 
    <add path="*" verb="*" type="Dottext.Common.UrlManager.UrlReWriteHandlerFactory
,Dottext.Common" validate="false" />
</httpHandlers>
    ASP.NET 2.0中新的页面编译模型给实现通配符映射应用程序带来意想不到的问题,下面我以博客园Blog软件为例与大家一些探讨这些问题。 
    在博客园Blog软件中,实现IhttpHandlerFactory接口的是Dottext.Common.UrlManager. UrlReWriteHandlerFactory,不改变在ASP.NET 1.1中实现的UrlReWriteHandlerFactory代码,直接在ASP.NET 2.0中编译并运行,当程序运行在IIS根目录下,就会在执行PageParser.GetCompiledPageInstance时出现“Object reference not set to an instance of an object”异常(运行在虚拟目录中不会出现这个问题)。这个问题是ASP.NET 2.0中的一个小Bug,之前我写的PageParser.GetCompiledPageInstance中的一个Bug及解决方法对这个问题进行了一些分析,这个问题可以通过在PageParser.GetCompiledPageInstance之前调用context.RewritePath("~/default.aspx")解决。 
    接着进行访问个人Blog主页的测试,比如:
http://www.cnblogs.com/dudu,访问时出现错误:
“There is no build provider registered for the extension ''. 
You can register one in the <compilation><buildProviders>
section in machine.config or web.config. Make sure is has a
BuildProviderAppliesToAttribute attribute which includes the value 'Web' or 'All'.”
    在ASP.NET 2.0中,当我们第一次访问一个页面时,必不少的两个过程是:1、页面编译 2、创建编译后的页面代码的实例。页面编译是根据所访问的url地址中的扩展名找到匹配的Build Provider对页面进行编译。这里出现的问题是由于ASP.NET 2.0运行时没找到相应的Build Provider,http://www.cnblogs.com/dudu这样地址,由于使用了通配符映射,在ASP.NET 2.0运行时处理时,得到的扩展名是空(如果没有使用通配符映射,IIS会自动将地址改为:http://www.cnblogs.com/dudu/default.aspx)。ASP.NET 2.0在这里的设计不足之处是没有考虑这种情况,无法通过在web.config中进行相应的配置来解决这个问题。如果能提供下面的配置,这个问题就可以轻松解决:
<buildProviders >
        <add  extension=".*" type="System.Web.Compilation.PageBuildProvider"/>
</buildProviders>
    对于这个问题,我的解决方法是在PageParser.GetCompiledPageInstance之前对url进行处理,在url中加上缺省文件,比如:default.aspx。如果你想使用其他的扩展名,比如:.html,需要在web.config中加上:
<buildProviders >
        <add  extension=".html" type="System.Web.Compilation.PageBuildProvider"/>
</buildProviders>。

0
相关文章