分享
 
 
 

ASP.NET移植须知

王朝asp·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

虽然微软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代码,您将需要加以修改,以显式地引用所需属性。请见下例:

'ASP Syntax (Implicit retrieval of Column Value property)

Set Conn = Server.CreateObject("ADODB.Connection")

Conn.Open("TestDB")

Set RS = Conn.Execute("Select * from Products")

Response.Write RS("Name")

'ASP.NET Syntax (Explicit retrieval of Column Value property)

Conn = Server.CreateObject("ADODB.Connection")

Conn.Open("TestDB")

RS = Conn.Execute("Select * from Products")

Response.Write (RS("Name").Value)

数据类型的变化

在Visual Basic .NET,整数值现在是32 位。Long数据类型为64 位。

当从ASP.NET中调用COM对象的方法或是在您自定义Visual Basic components组件中调用Microsoft® Win32® API,都可能发生问题。您特别要注意实际需要的数据类型,以确保您正确传递数值。

结构化的例外处理

虽然在Visual Basic .NET中,仍然沿用熟悉的On Error Resume Next 及On Error Goto错误处理方法,但是,它们不再是最好的方法。Visual Basic现在有成熟的,系统的例外处理方法。它们使用Try, Catch, 及 Finally等关键字。如果有可能的话,您应该转向这种新的错误处理模式,因为它运用了一个性能更加完善,稳定的机制来处理应用程序错误。

与前面介绍的.NET 框架与ASP.NET相比,COM基本没有变化。但是,这并不是说您从ASP.NET上运用它们时,您完全不需要顾及COM对象及它们的行为。以下是几点您必须注意的要素:

线程模式变化

ASP.NET线程模式是Multiple Threaded Apartment (MTA).这就是说,您所用的为Single Threaded Apartment (STA)而生成的组件,在ASP.NET中,如不采取特别预防措施,不再会可靠工作。这包括,但不局限于,用Visual Basic 6.0及先前版本生成的所有COM组件。

ASPCOMPAT 属性

现有的STA组件不需要任何修改就能使用。 您所要做的仅仅是在ASP.NET页面的<%@Page>标签中加入指示兼容的属性aspcompat=true。比如,<%@Page aspcompat=true Language=VB%>。使用这个属性会强制该页

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有