ASP.NET 2.0来了! 在我们为ASP.NET 2.0的新特性感到激动的同时,我想很多ASP.NET开发人员非常关心这样一个问题:ASP.NET 2.0的兼容性怎么样?ASP.NET 1.1开发的程序能直接运行在ASP.NET 2.0上吗?
在SDK文档中,对于.NET Framework 2.0的兼容性有这样描述的:“The .NET Framework provides a high degree of support for backward compatibility. For example, most applications created using version 1.0 will run on version 1.1 and applications using version 1.1 will run on version 2.0.”。
看了这样的描述,我想:如果ASP.NET 1.1开发的程序真能直接运行在ASP.NET 2.0上,那就太棒了,但ASP.NET 2.0相对于1.1的变化这么大,做到这样的兼容难度很大,微软一向对向后兼容很重视,我们应该有所期望。如果兼容性不理想,从ASP.NET 1.1 迁移到ASP.NET 2.0会带来很大的成本与风险。自己开发的程序可以在ASP.NET 2.0上重新编译,可程序中所用的第三方组件呢?
那我们拿博客园的程序做个试验吧。对程序不作任何修改,直接在IIS管理器中将ASP.NET切换至2.0, 并将*.*的映射改为ASP.NET 2.0。
程序安装在本机的blog虚拟目录中,首先我访问地址:http://localhost/blog(由于建立了通配符映射,IIS不会把地址改为http://localhost/blog/default.aspx), 出现第一个错误:
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 1.1中,这样访问是正常的,由于建立了通配符映射,请求由web.config中 <add verb="*" path="*" type="Dottext.Common.UrlManager.UrlReWriteHandlerFactory,Dottext.Common" />处理。而在ASP.NET 2.0 中,请求的资源需要有一个buildProvider来处理(在<buildProviders>中进行设置),而访问http://localhost/blog,并没有包含文件名,ASP.NET 2.0认为是一个扩展名为空的文件,找不到相应的buildProvider来处理(如果是aspx文件,默认的buildProvider是System.Web.Compilation.PageBuildProvider),所以会产生这样的错误。 我想应该可以通过在<buildProviders>中增加一个处理这类请求的buildProvider来解决这个问题,可是我在设置时遇到了一个问题:extension该如何设置?我尝试了以下几种设置都不行:
<add extension=".*" type="System.Web.Compilation.PageBuildProvider" />
<add extension="*" type="System.Web.Compilation.PageBuildProvider" />
<add extension="*.*" type="System.Web.Compilation.PageBuildProvider" />
<add extension="" type="System.Web.Compilation.PageBuildProvider" />(这个设置根本不允许)
不知是我没有找到设置的方法,还是extension本来就不支持通配符?如果是后者,这就是一个兼容性问题。但这种情况是比较特殊的,一般ASP.NET程序中不会遇到这样的情况。如果真的无法解决这个问题,那类似.Text这样使用通配符映射的方式将成为历史。如果谁知道解决方法,希望能得到您的指点。