ASP.NET移植须知
2024-07-10 12:58:31
供稿:网友
菜鸟学堂:
asp.net移植须知
统一教学网
日期:2001-11-5 9:05:00
出处:zdnet.com.cn
作者:未知
虽然微软asp.net的设计人员在asp 应用程序的向后兼容工作上做得相当出色,在致力于把web应用程序从asp迁至asp.net的时候,有几点需要特别注意。切实理解由.net平台改变或引入的技术及asp.net,会使移植过程变得相对简单。
为增进您对如何使asp应用程序在asp .net 环境中顺利运作的了解,本文着重探索了很多技术变化的方面。同时 ,也指出一些asp.net中可被用来改进现有应用程序的新功能。这并不是一篇全面认识asp.net新功能的文章。它主要涉及您所需要了解的实现成功移植的内容。
既然大多asp 应用程序使用微软visual basic® scripting edition (vbscript),我估计您们大多会选择使用visual basic .net移植到asp.net。这显然并不是必要条件,但在决定移植的同时改变编程语言会需要一些额外的努力,而且很可能会要求设计上的改变。
共存
在我们开始讨论具体的兼容与移植的问题前,您必须明白asp与asp.net 如何共存。asp与asp.net应用程序可以在服务器上共同运行而不互相排斥。这主要是因为这两种技术使用的文件后缀(.asp versus .aspx)与配置模式(metabase/registry versus xml-based configuration files)都有所不同。两种系统有着截然不同的处理引擎。
完全有可能使一应用程序的一部分运行asp, 而它的另一部分运行asp.net。 如果您需要从一个既庞大又变化非常快的站点逐步变为asp.net,这一点就显得非常重要了。有人也许会认为一次性打包发布整个站点更好些。这对于web应用的某些类型也许适用,但我想很多现有的网站,由于其规模巨大,结构复杂,网站内容与形式的革新迅速,而不适用此法。毕竟,如果您的网站有利可图,投资方恐怕十有八九会不断地让您加入新功能,而使您没法转向这个新的热门技术中去。另外,如果您打算全力转向asp.net,并把它当成长期投资,您会想利用这个机会尽可能的改进结构与设计。在这些情况下,用渐进的方式实现共存是必需的。
兼容性问题
把您的应用程序移植到asp.net也许并不容易;然而,也并不那么难。asp.net与asp兼容性非常好。做到这点非常不容易,因为从asp到asp.net是一场全新的变革。asp.net的设计者们原来计划要做到100%与asp兼容,但最终为了长远考虑,出于优化该平台的目的,不得不收回计划。您不用担心,所有的变化都是往好的方向发展,不会在您安装时造成很大工作量。综合实际发生的变化,可以分为以下几项:
核心api 变化
结构变化
visual basic语言变化
与com 相关的变化
应用程序配置的变化
状态管理问题
涉及安全性问题
数据访问
所有以上方面都会在下文中详细讨论。
核心api 变化
asp的核心api由一些固有对象(request, response, server, 等)及与它们相关的方法组成.除了一些简单变化,这些api在asp.net下会继续工作无误.所有的变化都与request 对象有关.请看表一:
表1:api 变化
request(item)
在asp中, 该方法会返回字符串数组.在asp .net,它会返回namevaluecollection.
request.querystring(item)
在asp中, 该方法会返回字符串数组.在asp .net,它会返回namevaluecollection.
request.form(item)
在asp中, 该方法会返回字符串数组.在asp .net,它会返回namevaluecollection.
可以看出, 这些变化对所有的方法都是一样的。
如果,您要访问的对象对某键值有唯一值,您就不需要修改您的代码。可是,如果有多个值,您就需要用不同的方法获得它们。另外,请注意visual basic .net中的集合是以零为基的,而vbscript的集合是以一为基的。
例如,在asp中,访问来自对http://localhost/myweb/valuetest.asp?values=10&values=20发出的请求的单独查询字符窜数值,可能会得到以下结果:
<%
'this will output "10"
response.write request.querystring("values")(1)
'this will output "20"
response.write request.querystring("values")(2)
%>
在asp .net中,querystring属性返回namevaluecollection对象。从此对象中,您可以获得数值集合,及您想要的真正内容。再一次要强调的是:请注意集合中的第一项是基于零而不是一:
<%
'this will output "10"
response.write (request.querystring.getvalues("values")(0))
'this will output "20"
response.write (request.querystring.getvalues("values")(1))
%>
无论是asp还是asp.net,以下代码执行结果是一样的:
<%
'this will output "10", "20"
response.write (request.querystring("values"))
%>
结构变化指的是那些影响active server pages布局与代码风格的变化。您必须对它们有所了解以确保您的代码会在asp.net中运行无误。
代码块: 声明函数与变量
在asp中,您可以在您的代码标示符中声明子程序与全局变量.
<%
dim x
dim str
sub mysub()
response.write "this is a string."
end sub
%>
在asp.net中,这已被禁止。您必须在<script> 块中声明所有函数与变量。
<script language = "vb" runat = "server">
dim str as string
dim x, y as integer
function add(i as integer, j as integer) as integer
return (i + j)
end function
</script>
编程语言混合
在asp编程语言中,您基本上有两种选择:vbscript 或 microsoft® jscript®。 您可以在同一页自由混合搭配脚本块。
在asp.net,您现在有三种选择。您可以使用c#, visual basic .net, 或 jscript。请注意我说的是visual basic .net 而不是vbscript。这是因为vbscript不存在于.net 平台。它已经完全被visual basic .net归入。虽然您可以自由选择任何语言,必须注意的是您不能再在同一页任意混合不同语言。当然您可以在您的应用程序page1.aspx中包含c#代码,而page2.aspx中包含visual basic .net代码。您所不能做的是把它们混合放在同一页面。
新页面指令
在asp中,您必须把所有指示指令放在页面的第一行, 而且只能在同一个代码标志符内。例如:
<%language="vbscript" codepage="932"%>
在asp.net中,您必须把语言指令与页面指令放在一行。例如:
<%@page language="vb" codepage="932"%>
<%@qutputcache duration="60" varybyparam="none" %>
您可以根据需要,加入任意多条指令。指令可以被放在您的.apsx文件中的任何地方,但标准做法是置于文件开头。
asp .net纳入了一些新的指令。我建议您在asp.net相关文件中查找更多信息,看这些新指令是否能为您的应用程序带来益处。
render 函数不再有效
在asp中,开发人员发现它们可以利用所谓“输出函数”做些聪明的事。输出函数是一种正文中嵌入着大量html的子程序。例如:
<%sub renderme()
%>
<h3> this is html text being rendered. </h3>
<%end sub
renderme
%>
虽然用这些函数可以做很多很酷的事情,该代码在asp.net中不再允许使用,这应该是一种进步。我相信,在您像这样开始混合或搭配代码与html时,您见过有些函数很快就无法阅读与管理了。让它在asp.net中工作的最简单方法是调用 response.write 去取代您的html 输出。例如:
<script language="vb" runat="server">
sub renderme()
response.write("<h3> this is html text being rendered. </h3>")
end sub
</script>
<%
call renderme()
%>
请注意我说了:“最简单的方法”,这并不是说它是最好的方法。取决于您的输出代码的复杂程度与数量,使用自定义的web controls可能对您有利。它使您可以用程序设置html属性,并真正把您的内容与代码分开。这样可以大大提高您的代码可读性。
正如我所提到过的,vbscript 已被更全面更强大的visual basic .net所取代。在这部分,我会强调那些您可能会碰到的与visual basic语言变化相关的问题。请注意我并不会列出关于visual basic所有的变化,而只会着眼于一个由visual basic .net转向asp .net的asp/vbscript 程序员可能会遇到的情况。欲知所有语言变化,请参考visual basic .net相关文档。
告别variant数据类型
我们知道它,我们爱它,我们也恨它。我说的当然是variant数据类型。variant数据类型不是.net的一部分,所以在visual basic .net中也不支持它。这也就意味着您所有的asp变量正在不知不觉地从variant数据类型转为对象类型。您的应用程序里的大多变量应根据需要改为相应的基元类型。如果您的变量在visual basic术语中确实是对象类型,只需在asp.net中简单声明其为object即可。
visual basic 数据类型
一种一定会引起特别关注的variant是vt_date数据类型。在visual basic中它被表示为date类型。在visual basic中,date 是以4个字节的双字节格式存储的。在visual basic.net中, date使用common language runtime datetime 类型,用8个字节整数来存储。
既然在asp中,所有变量都是variant数据类型,您使用的date变量会被编译,也可能继续工作(这取决于他们是如何被正确使用。)可是,您在使用这些变量时,也有可能会遇到各种各样的问题,因为它们实际的数据类型已经改变。在把数值作为长整数类型送入com对象或是对日期类型用clng实施某些转换操作时,尤要注意。
option explicit 现为默认
在asp中,option explicit 没有被规定为默认设置。visual basic .net在这点上作了改变。option explicit成为默认值,因此,所有变量都需要声明。如果更严格一些的话,可以把您的设置变为option strict,这样可以迫使您声明所有的变量为某种数据类型。虽然这看似冗余,却是您应该坚持的做法。如果您不这样做,您的代码远远不可能优化,因为所有未经声明的变量会变成object 类型。大多数隐性转换仍会有效,但如果您声明清楚所有变量的话,以后您就可以更安心了。
let 与 set不再被支持
对象可以像这样直接赋值:myobj1 = myobj2。如果您的程序里有set 或let 关键字, 它们必须被移掉。
用括号实现方法调用
在asp中,您无须使用括号就可以自由调用对象的方法。例如:
sub writedata()
response.write "this is data"
end sub
writedata
在asp .net中, 做任何调用,您都必须使用括号,即使是不使用任何参数的方法也是一样。按照如下例所示方法书写代码,可以使代码在asp与 asp.net环境中都工作无误。
sub writedata()
response.write("this is data")
end sub
call writedata()
byval成为默认
在visual basic中,所有参数默认以引用(或byref)方式来传递。在visual basic .net中有所改变。所有参数默认以值(或byval)传递。如果您仍然希望以引用来传递,您必须在参数之前清楚注明byref关键字。例如:
sub mybyrefsub (byref value)
value = 53;
end sub
这就是您必须非常小心的地方。当您将您的代码转向asp.net,我建议您对方法调用中的每个参数作两次甚至三次的检查,以确保这种变化确实符合您的期望。我估计,在检查过程中,总会查出些错误。
不再有默认属性
默认属性的概念不再存在于visual basic .net。 这也就意味着如果您有依赖于来自某对象的默认属性的asp代码,您将需要加以修改,以显式地引用所需属性。请见下例: