Asp编码优化技巧8则ASP(ActiveServerPage)是Microsoft公司推出的基于PWS(PersonalWebServer)&IIS(InternetInformationServer)平台的、基于ISAPI(InternetServiceAPI)原理的动态网页开发技术,目前日趋成熟完善。在这里仅就代码优化进行一些简单讨论。1、声明VBScript变量在ASP中,对vbscript提供了强劲的支持,能够无缝集成vbscript的函数、方法,这样给扩展ASP的现有功能提供了很大便利。由于ASP中已经模糊了变量类型的概念,所以,在进行ASP与vbscript交互的过程中,很多程序员也惯于不声明vbscript的变量,这样加重了服务器的解析负担,进而影响服务器的响应请求速度。鉴于此,我们可以象在VB中强制用户进行变量声明一样在vbscript中强制用户进行变量声明。实现方法是在ASP程序行首放置<%optionexplicit%>。2、对URL地址进行编码在我们使用asp动态生成一个带参数URL地址并进行跳转时,在IE中解析很正常,但在NetScrape浏览时却有错误如下:HTTPError400400BadRequestDuetomalformedsyntax,therequestcouldnotbeunderstoodbytheserver.Theclientshouldnotrepeattherequestwithoutmodifications.解决方法是对生成的URL参数使用ASP内置server对象的URLencode方法进行URL编码,例子如下:<%URL=xur.aspvar1=username=&server.URLencode(xur)var2=&company=&server.URLencode(xurstudio)var3=&phone=&server.URLencode(021-53854336-186)response.redirectURL&?&var1&var2&var3%>3、清空对象当使用完对象后,首先使用Close方法来释放对象所占用的系统资源;然后设置对象值为“nothing”释放对象占用内存。当年,我就是在一张页面上创建了百余个没有清空对象的记录集而崩溃了我的IIS。下面的代码使用数据库内容建立一个下拉列表。代码示例如下:<%myDSN=DSN=xur;uid=xur;pwd=xurmySQL=select*fromauthorswhereAU_ID<100setconntemp=server.createobject(adodb.connection)conntemp.openmyDSNsetrstemp=conntemp.execute(mySQL)ifrstemp.eofthenresponse.write数据库为空response.writemySQLconntemp.closesetconntemp=nothingresponse.endendif%><%dountilrstemp.eof%><%rstemp.movenextlooprstemp.closesetrstemp=nothingconntemp.closesetconntemp=nothing%>4、使用字符串建立SQL查询使用字符串来建立查询并不能加快服务器的解析速度,相反,它还会增加服务器的解析时间。但在这里仍然推荐使用字符串代替简单的查询语句来进行查询。这样做的好处是,可以迅速发现程序问题所在,从而便利高效地生成程序。示例如下:<%mySQL=select*mySQL=mySQL&frompublishersmySQL=mySQL&wherestate='NY'response.writemySQLsetrstemp=conntemp.execute(mySQL)rstemp.closesetrstemp=nothing%>5、使用case进行条件选择在进行条件选择的时候,尽量使用case语句,避免使用if语句。使用case语句,可以使程序流程化,执行起来也比if语句来的快。示例如下:<%FORi=1TO1000n=iResponse.WriteAddSuffix(n)&<br>NEXT%><%FunctionAddSuffix(num)numpart=RIGHT(num,1)SELECTCASEnumpartCASE1IFInStr(num,11)THENnum=num&thELSEnum=num&stENDIFCASE2IFInStr(num,12)THENnum=num&thELSEnum=num&ndENDIFCASE3IFInStr(num,13)THENnum=num&thELSEnum=num&rdENDIFCASE4num=num&thCASEELSEnum=num&thENDSELECTAddSuffix=numENDFUNCTION%>6、使用adovbs.inc文件中定义的常量打开记录集打开记录集时,可以定义记录集打开的游标类型和锁定类型。在adovbs.inc文件中定义了一些常量来定义这些类型。adovbs.inc文件保存在\inetpub\iissamples\IISamples目录下面。下面列举几个常用的游标类型和锁定类型。游标类型:adOpenFowardOnly游标只能向前;adOpenKeyset游标可向前或者向后,如一用户添加记录,新记录不会出现在记录集中;adOpenDynamic游标动态随意;adOpenStatic记录集不对其他用户造成的记录修改有所反映。锁定类型:adLockReadOney不能修改记录集中的记录;adLockPessimistic在编辑一条记录时锁定它;adLockOptimstic调用记录集Update方法时才锁定记录;adLockBatchOpeimstic记录只能成批更新。<!--#INCLUDEVIRTUAL=/ADOVBS.INC--><%connectme=DSN=xur;uid=xur;pwd=xursqltemp=select*frompublisherswherename='xur'setrstemp=Server.CreateObject(adodb.Recordset)rstemp.opensqltemp,connectme,adOpenStatic,adLockOptimsticresponse.writerstemp.recordcount&recordsin<br>&sqltemprstemp.closesetrstemp=nothing%>7、避免在使用global.asa文件中进行对象定义由于global.asa文件中的内容可以为站点内所有文件引用,无疑,在global.asa文件中进行对象定义可以省去很多重复工作。比如在global.asa中的application_onstart函数中进行如下定义:<%SUBapplication_onstartsetapplication(theCONN)=server.createobject(adodb.connection)ENDSUB%>;这样就可以在站点任何代码中做类似引用:<%mySQL=select*frompublisherswherestate='xur'setrstemp=application(theconn).execute(mySQL)%>同样地,可以在session_onstart函数中创建记录集对象<%SUBsession_onstartsetsession(rstemp)=server.createobject(adodb.recordset)ENDSUB%>然后在站点也面中进行如下引用:<%mySQL=select*frompublisherswherestate='xur'setsession(rstemp)=conntemp.execute(mySQL)%>但这样做的同时也有很大的负面影响,由于Application和session变量都只有在关闭网站的时候才释放占用的资源,所以session参数会浪费大量不必要内存,而且此时application变量成为服务器性能的瓶颈。解决方法:建立定义对象asp页面,在需要进行调用这些对象的页面上,引入这张asp页面。假设定义对象的asp页面名称为define.asp,则只要在对应asp页面中加入以下语句就能引入该页面。<!--#INCLUDEVIRTUAL=/define.asp-->在进行页面引进时,最好在待引进的asp文件中不要包含<%@LANGUAGE=VBSCRIPT%>语句。因为在asp文件中,只能有一句由@来定义的脚本解析语言。8、安全防护asp提供了很好的代码保护机制,所有的asp代码都在服务器端执行而只返回给客户端代码执行结果。即便这样,在老版本的IIS中还可以在文件名后面家::$DATA来查看asp的源代码,这已经属于WebServer安全范畴不在本文讨论范围内。下面提出两点简单的安全注意事项。虽然在asp中建议引入文件以inc作为扩展名,在这里仍建议以asp作为引文件的扩展名。当这些代码在安全机制不好的WebServer上运行时,只需在地址栏上输入引入文件的地址(inc为扩展名),就可以浏览该引入文件的内容,这是由于在WebServer上,如果没有定义好解析某类型(比如inc)的动态连接库时,该文件以源码方式显示。不要把数据库文件放在网站结构内部,这样,当恶意人士获取数据库路径后,就可以轻易获取该数据库,进而肆意更改数据库内容。比较好的做法是,为数据库建立DSN(DateSourceName),而在进行数据库访问时直接访问该DSN。改进ASP应用程序中的字符串处理性能摘要:大多数ActiveServerPages(ASP)应用程序都要通过字符串连接来创建呈现给用户的HTML格式的数据。本文对几种创建此HTML数据流的方法进行了比较,在特定情况下,某些方法在性能方面要优于其他方法。本文假定您已经具备一定的ASP和VisualBasic编程方面的知识。简介编写ASP页面时,开发人员实际上是创建一个格式化的文本流,通过ASP提供的Response对象写入Web客户端。创建此文本流的方法有多种,而您选择的方法将对Web应用程序的性能和可缩放性产生很大影响。很多次,在我帮助客户优化其Web应用程序的性能时,发现其中一个比较有效的方法是更改HTML流的创建方式。本文将介绍几种常用技术,并测试它们对一个简单的ASP页面的性能所产生的影响。ASP设计许多ASP开发人员都遵循良好的软件工程原则,尽可能地将其代码模块化。这种设计通常使用一些包含文件,这些文件中包含对页面的特定不连续部分进行格式化生成的函数。这些函数的字符串输出(通常是HTML表格代码)可以通过各种组合创建一个完整的页面。某些开发人员对此方法进行了改进,将这些HTML函数移到VisualBasicCOM组件中,希望充分利用已编译的代码提供的额外性能。尽管这种设计方法很不错,但创建组成这些不连续HTML代码组件的字符串所使用的方法将对Web站点的性能和可缩放性产生很大的影响,无论实际的操作是在ASP包含文件中执行还是在VisualBasicCOM组件中执行。字符串连接请看以下WriteHTML函数的代码片断。名为Data的参数只是一个字符串数组,其中包含一些要格式化为表格结构的数据(例如,从数据库返回的数据)。FunctionWriteHTML(Data)DimnRepFornRep=0to99sHTML=sHTML&vbcrlf_&TRTD&(nRep+1)&/TDTD_&Data(0,nRep)&/TDTD_&Data(1,nRep)&/TDTD_&Data(2,nRep)&/TDTD_&Data(3,nRep)&/TDTD_&Data(4,nRep)&