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这样使用通配符映射的方式将成为历史。如果谁知道解决方法,希望能得到您的指点。
     那我们用正常的地址方式访问吧,输入http://localhost/blog/default.aspx ,OK!首页竟然显示出来了!当我正在赞叹ASP.NET 2.0的兼容性时,突然弹出了“Visual Studio Just-In-Time Debugger”窗口,窗口的错误信息为:
“An unhandled exception("System.Data.SqlClient.SqlException") occurred in aspnet_wp.exe”。出现这样的错误,真让人失望。难道ADO.NET也不兼容? 这时,我多次刷新页面进行测试,竟然出现了“Server Application Unavailable”错误。写到这,当我准备对ASP.NET 2.0的兼容性进行批评时。我突然想到是不是连接字符串设置的问题,ASP.NET 2.0的兼容性不应该这么差,我本来采用的是集成Windows验证(IntegratedSecurity=SSPI), 改成SQL Server验证试试。果然是Integrated Security=SSPI引起的,改过后,这两个错误就不出现了。Integrated Security=SSPI为什么会引起这个问题?是不是兼容性引起的?是不是通过更改设置可以解决?目前还不知道,以后再仔细分析吧。虽然存在上面所说的问题,但我觉得这样的兼容性还是可以接受的。
     继续测试。网站首页、Blog首页可以访问,进入管理页面试试,又来一个错误:

The WebResource.axd handler must be registered in the configuration to process this request.
<!-- Web.Config Configuration File -->
<configuration>
   <system.web>
       <httpHandlers>
           <add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="True" />
       </httpHandlers>
   </system.web>
</configuration> 
  
一看就知道,这是与FreeTextBox相关的,明明web.config有这个设置,而且在ASP.NET 1.1中运行正常,看来是ASP.NET 2.0带来的问题。对于第三方控件的兼容问题,我们束手无策,只有两个选择:
1、等第三方控件升级后,再升级自己的程序;
2、放弃使用该控件。

     继续往下测试,查看文章分类页面,出现错误:
Parser Error
Description: An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately.
Parser Error Message: Ambiguous match found.
Source Error:
Line 1:  <%@ Control Language="c#" Inherits="Dottext.Web.UI.Controls.EntryList" %>
Line 2:  <%@ Import Namespace = "Dottext.Framework" %>
Line 3:  <h2><asp:Literal ID = "EntryCollectionTitle" Runat = "server" /></h2>

对这样的错误我目前是束手无策,以后再分析。
今天就测试到这吧!

由于刚刚接触ASP.NET 2.0, 如果文章中有不妥之处,欢迎指正。