ASP.NET移植须知(续)
2024-07-10 12:58:31
供稿:网友
'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%>。使用这个属性会强制该页面在sta模式下执行,从而确保您的组件正常工作。如果您的页面不指定本属性而直接引用sta组件,在运行时将发生异常。
设置aspcompat=true也将使您的页面能够调用那些需要使用asp内建对象的com+1.0组件。这可以通过objectconect对象来实现。
设置本属性会导致一定的性能下降。我建议您仅在必要的情况下使用它。
预先绑定与滞后绑定
在asp中,所有对com组件的调用都是通过idispatch接口进行的。由于所有调用都需要在运行时由idispatch间接处理,我们称之为滞后绑定。在asp.net中,如果您愿意,您仍然可以使用这种方式来完成对象调用。
dim obj as object
obj = server.createobject("progid")
obj.mymethodcall
以上代码能够工作,但这并不是我们所推荐的用法。在asp.net中,您可以利用预先绑定直接创建您需要的对象:
dim obj as new myobject
myobject.mymethodcall()
预先绑定能使您的页面在与组件的交互过程中避免出现类型错误。为了使用预先绑定,您需要在项目中加入一个引用,正如您在vb6.0项目中加入一个com组件引用一样。假设您使用的开发工具是visual studio.net,vs.net将会在后台创建一个位于com组件之上的代理对象,让您感到就像在使用.net组件一样方便。
至此您可能会提出性能问题。为了保证与com的互操作性,我们引入了代理对象,这的确会带来一定的性能负担。然而,在大多数情况下,您并不需要担心由此而引发的性能下降。毕竟,与冗长的idispatch调用相比,代理对象所执行的cpu指令几乎可以忽略不计。您所赢得的远远超过您所失去的性能。当然,理想的状况是完全使用新创建的,被管理的(managed)对象。然而,理想状况近期还不可能达到——我们必须保护在过去几年里对com技术的投资。
onstartpage和onendpage方法
在使用传统的onstartpage和onendpage方法问题上,您可能需要多花一些时间。如果您依赖于这两个方法来访问asp固有对象,那么您需要使用aspcompat指令,然后用server.createobject以预先绑定的方式来创建对象。见下例:
dim obj as myobj
obj = server.createobject(myobj)
obj.mymethodcall()
请注意我们没有用“progid”,而是用了预先绑定的实际对象类型。为了保证以上代码正常工作,您需要在visual studio项目中加入对该com组件的引用,以便vs创建一个预先绑定的包装类。这里是您必须继续使用server.createobject的唯一理由。
com小结
表2列出了您为了继续有效使用现有的com组件所必须做的事情。
表2. 传统com对象的asp.net设置
com 组件类型/方法
asp .net 设置/例程
custom sta (visual basic 组件 或其它被标志为"apartment"的组件)
使用 aspcompat属性, 和预先绑定
custom mta (或其它被标志为"both" or "free" 的atl 或自定义的 com组件)
使用预先绑定,不当但不要用 aspcompat属性
内置对象 (通过objectcontext 对象来访问)
使用 aspcompat属性, 和预先绑定
onstartpage, onendpage
使用 aspcompat属性, 和server.createobject(type)
无论您的组件是否使用com+来部署,以上设置都适用。
在asp中,web应用程序的配置信息都存放在系统注册表或iis的配置数据库(metabase)中。在很多情况下,由于服务器缺乏适当的管理工具,察看或修改这些设置成为非常困难的一项工作。asp.net引入了全新的,基于简单、可读的xml文件的配置模式。asp.net应用程序在自己的目录下有一个web.config文件。您可以通过修改web.config文件来控制应用程序的自定义配置,行为,和改变它的安全属性。
由于习惯的作用,您可能像我一样还是忍不住要打开internet service manager来查看或修改asp.net应用程序的配置。然而,您必须理解,我们现在有两套独立的配置模式。除了一些安全设置,绝大多数由iis管理工具所生成的设置都会被asp.net应用程序忽略。您需要把这些设置放在web.config文件里。
关于.net应用程序的设置有专门的文章讨论,我这里不再赘述。表3列出了一些比较有趣的配置。请记住还有非常多的配置项目没有列在这张表中。
表3. web.config 文件设置范例
项目
描述
<appsettings>
定制应用程序配置
<authentication>
设定asp.net应用程序对身份验证的支持
<pages>
设定页面相关的配置
<processmodel>
设置asp.net在iis系统中的进程模式
<sessionstate>
指定一些会话状态选项
.net基本类库中有一些类可以用来在程序中简化应用程序配置访问方式。
如果您的应用程序使用了session或application固有对象来存储状态信息,那么它仍然能够在asp.net中正确运行。在asp.net中,您有了更多的选择来存储状态相关的数据。
可用的状态管理方法
asp.net提供了更多的状态存储摸式。这使您的应用程序能够跨越多个web服务器支持web farm范围内的状态管理。
您可以用web.config文件中的<sessionstate>部分来配置状态管理选项。见下例:
<sessionstate
mode="inproc"
stateconnectionstring="tcpip=127.0.0.1:42424"
sqlconnectionstring="data source=127.0.0.1;user id=sa;password=" cookieless="false"
timeout="20"
/>
mode属性指定了您想要存储状态信息的位置。您可以选择的状态包括inproc, stateserver, sqlserver, 及off。
表 4. 会话状态存储信息
选项
描述
inproc
会话状态存储于服务器本地。(asp 风格)。
stateserver
会话状态存储于远程或本地的状态服务进程。
sqlserver
会话状态存储于sql 服务器数据库。
off
会话状态被关闭。
当你选用stateserver状态,stateconnectionstring 会起作用;而当您使用sqlserver状态, sqlconnectionstring会起作用。对于每个应用程序,您仅可以使用一个存储选项。
存储com组件
需要记住的一点是如果您依赖在您的session 或application对象中的传统com组件的存储引用,您就不可以在应用程序中使用新的状态存储机制(stateserver 或sqlserver)。您只能使用inproc。这是因为在.net中, 那些对象需要能够自我序列化, 但显然com 组件做不到. 相反, 您新创建的管理(managed)组件可以相对容易实现这一点,当然也就可以使用新状态存储模式。
性能
提到性能,当然没有免费可言。可以保证的是,在大多数的情况下,inproc会继续保持其性能之最。紧随其后的是stateserver和sqlservr。您应当用您的应用程序进行专门测试,以作出最符合您性能要求的选择。
在asp和asp.net中共享状态
另一个应当注意的问题是虽然您的工具能够容纳asp和asp.net网页,但是您不能共享固有会话或应用对象的状态变量。您可以将信息在两个系统中进行复制,也可以在您的应用程序完全移植前,提供一个自定义的解决方法。底线是:如果您对session和application对象运用很少,您不会受到很大影响。但就另一方面而言,如果您对这些对象运用很多,您则需要谨慎的运用。您或许可以考虑采自定义一个短期解决方法以共享状态。
安全性是又一个值得关注的地方。这里提供的是对asp.net安全系统的简要概括。要获得更详尽的信息,请参阅asp.net安全系统的有关文件。
asp .net的安全性主要由web.config文件中的安全设置部分来控制。asp .net与iis协调一致,紧密配合,为您的应用程序提供一个完整的安全模式。一些极少数的iis 安全性设置会以在asp中同样的方式被asp.net继承和运用。当然,它还有许多附加的增强组件。
身份验证
对于身份验证,asp.net支持列表5中的不同选项。
列表5. asp .net 身份验证的选项
类型
描述
windows
asp .net用windows 身份验证.
forms
基于cookie,自定义登录表.
passport
微软对外提供passport 服务.
none
没有进行身份验证
除了新的passport 身份验证选项以外,这些选项在asp中是相同的。以windows为基础的身份验证在以下例子中的配置下能得到运用。
<configuration>
<system.web>
<authentication mode="windows"/>
</system.web>
</configuration>
授权
当您的用户通过身份验证之后,您可以对希望他们访问的资源进行授权。以下例子说明访问权限被授予“jkieley”和“jstegman”,任何其他人都将被拒绝访问。
<authorization>
<allow users="northamerica/jkieley, redmond/jstegman"/>
<deny users="*"/>
</authorization>
扮演
扮演是指一个对象以另一个实体身份标识来执行代码的过程. 在 asp中, 扮演将允许您的代码由授权用户运行.同样的,您的用户能够在一个特殊的标识下匿名运行。在默认情况下,asp.net对模拟并不是有求必应。这与asp是不同的。如果您依赖这个功能,您需要在您的web.config文件中,如下所示,激活该功能。
<identity>
<impersonation enable = "true"/>
</identity>
在移植时另一个要注意的关键是数据访问。通过ado.net的介绍,您现在有了一个高效的新方法来获取数据。因为数据访问就它本身而言是个很大的话题,所以它已超出了本文的范围。对大多数情况而言,您能像以前一样继续使用ado,但是我仍推荐您看一下ado.net。这是在您asp.net应用程序中改进数据访问方法的一种有效途径。
使用asp .net的准备工作
现在您已知道了大多数您可能碰到的问题,您也许想知道在最终转向asp.net之前的今天您该做些什么以做好准备。为了让过程更顺利,有很多工作可以做。即使您将来不转向asp.net,这里的许多建议对您的asp代码也是有帮助的。
使用option explicit
这是个很好的建议,但并不是每个人都使用它. 当在asp中使用option explicit来强制变量声明时, 您会至少清楚地了解所有内容在哪里定义,及变量如何定义。一旦转到asp.net, 我建议您使用option strict. option explicit 在visual basic.net中是默认的。 但是,如果使用更具强制性的option strict, 您就能确保所有的变量都被声明为正确的数据类型. 虽然这势必增添额外工作量,但是长远看来,您将会发现这是很值得的。
避免使用默认属性
正如我们所讨论的,默认的属性将不再被允许。访问属性原本就不是很困难的事。这会使您的代码更具可读性,同时,将来移植时也会更节省时间.
使用括号 和call关键字
就如本文前面所描述的一样,应尽可能的使用括号和call 语句。 在 asp .net 中您将会被迫使用括号。现在就使用call语句助您早日养成优良编程习惯,以更好的适应将来的需求。
避免嵌套式包含文件
这点说来容易,做起来难。但是,您应该尽可能地避免嵌套您的包含文件。说得更清楚一点就是, 您应当最大幅度避免重复嵌套文件。久而久之,往往发生的情况是,您的代码不得不依赖于一个全局变量,而该变量又是在其他地方的包含文件中被定义。您能够访问它是因为您的某个包含文件包含了这个您正真需要的包含文件。
当您转向asp .net,您将很有可能将您的全局变量和程序移入类库中。这时如果您了解在哪里访问所有内容,就会方便很多。最后您也许不得不重新放置些文件,并改变一些重名例程的名字。
将功能函数组织成单个文件
在移植过程中的一个策略就是把功能函数和代码转移到visual basic 或c#类库中。相对于多重解释型的asp文件,您最终可以把所有的代码放进它所属的对象。提前组织您的代码会节省您未来的时间。在最理想的状态下,您应该可以将子程序编组为逻辑文件。这样您就能够非常容易地创建一组vb或者c#类。这些功能在com 对象中恐怕早就该有了。
如果在服务器端的包含文件中您有很多混合的全局变量或常数,不妨将他们也放到一个文件中。一旦您转向asp.net,您将能很容易的创建一个能容纳您所有全局变量或常数的类。这样您会有一个更有条理,更容易维护的系统。
尽可能地从内容中移掉代码
您应尽可能的将您的代码从html的内容中分离开来,这是另一个易说难做的工作。把混有代码和脚本的函数体清除出函数。这样做的话,您就会跟好的实现代码隐藏,因为这是一个asp.net下的理想模式。
请勿在<%%>块中声明函数
在asp.net中,这种写法已经不支持了。您应该把您的函数声明在<script>块内。请参考前面结构变化部分中的例子。
避免输出(render) 函数
与先前讨论的一样,您应该避免使用输出函数。如果现在您能改变或准备您的代码,当组建这些类型的函数时,您应该使用”response.write”语句块。
明确地释放资源 (调用close方法)
请尽量明确地调用任何close()或您所用对象与资源的释放方法。就释放而言,我们都知道visual basic 与vbscript会自动释放资源。它们一般都能立刻释放资源,但是,当我们转向.net,我们没法确切地知道资源何时被释放。所以您应该尽可能显示地释放资源。
避免混合语言
如果有可能的话,您应该避免在同一页上混合服务器端的vbscript 与jscript。总的来说,混合不同语言的做法本来就是很糟糕的编程习惯。由于新的编译模式的变化,每页要求在<%%>块内只能有一种语言。这也是一个向asp.net 移植时要注意的问题。您可以继续使用你习惯的方式编写客户端脚本。
总结
综上所述,在您把您的应用程序迁至asp.net时,您需要注意相当多的方面。我在本文中提出的大多变化应该都是很容易实施的。
如果您的网站很大,当您完成这一过程时,您发现并修复的死代码,低效程序,bug的数量,可能会多得足以让您惊叹。同时,您将能充分享受asp.net 乃至整个.net平台所带来的众多强大功能。
注册会员,创建你的web开发资料库,