首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > ASP >

ASP编码优化,该怎么解决

2012-03-15 
ASP编码优化ASP(ActiveServerPage)是Microsoft公司推出的基于PWS(PersonalWebServer)&IIS(InternetInforma

ASP编码优化
ASP(Active   Server   Page)是Microsoft公司推出的基于PWS(Personal   Web   Server)&IIS(InternetInformation   Server)平台的、基于ISAPI(InternetServiceAPI)原理的动态网页开发技术,目前日趋成熟完善。在这里仅就代码优化进行一些简单讨论。


1、  声明VBScript变量


在ASP   中,对vbscript提供了强劲的支持,能够无缝集成vbscript的函数、方法,这样给扩展ASP的现有功能提供了很大便利。由于ASP中已经模糊了变量类型的概念,所以,在进行ASP与vbscript交互的过程中,很多程序员也惯于不声明vbscript的变量,这样加重了服务器的解析负担,进而影响服务器的响应请求速度。
鉴于此,我们可以象在VB中强制用户进行变量声明一样在vbscript中强制用户进行变量声明。实现方法是在ASP程序行首放置 <%   optionexplicit%> 。

2、  对URL地址进行编码


在我们使用asp动态生成一个带参数URL地址并进行跳转时,在IE中解析很正常,但在NetScrape浏览时却有错误如下:
HTTP   Error   400
400   Bad   Request
Due   to   malformed   syntax,   the   request   could   not   be   understood   by   the   server.
The   client   should   not   repeat   the   request   without   modifications.
解决方法是对生成的URL参数使用ASP内置server对象的URLencode方法进行URL编码,例子如下:
<%
URL= "xur.asp "
var1= "username= "   &   server.URLencode( "xur ")
var2= "&company= "   &   server.URLencode( "xurstudio ")
var3= "&phone= "   &   server.URLencode( "021-53854336-186 ")
response.redirect   URL   &   "? "   &   var1   &   var2   &   var3  
%>

3、  清空对象


当使用完对象后,首先使用Close方法来释放对象所占用的系统资源;然后设置对象值为“nothing”释放对象占用内存。当年,我就是在一张页面上创建了百余个没有清空对象的记录集而崩溃了我的IIS。下面的代码使用数据库内容建立一个下拉列表。代码示例如下:
<%   myDSN= "DSN=xur;uid=xur;pwd=xur "
mySQL= "select   *   from   authors   where   AU_ID <100 "
set   conntemp=server.createobject( "adodb.connection ")
conntemp.open   myDSN
set   rstemp=conntemp.execute(mySQL)
if   rstemp.eof   then
response.write   "数据库为空 "
response.write   mySQL
conntemp.close
set   conntemp=nothing
response.end  
    end   if%>
<%do   until   rstemp.eof   %>
<%
rstemp.movenext
loop
rstemp.close
set   rstemp=nothing
conntemp.close
set   conntemp=nothing
%>

4、使用字符串建立SQL查询


使用字符串来建立查询并不能加快服务器的解析速度,相反,它还会增加服务器的解析时间。但在这里仍然推荐使用字符串代替简单的查询语句来进行查询。这样做的好处是,可以迅速发现程序问题所在,从而便利高效地生成程序。示例如下:
<%mySQL=   " "select   *   "
mySQL=   mySQL   &   "from   publishers "
mySQL=   mySQL   &   "where   state= 'NY ' "
response.write   mySQL
set   rstemp=conntemp.execute(mySQL)
rstemp.close
set   rstemp=nothing
%>

5、  使用case进行条件选择


在进行条件选择的时候,尽量使用case语句,避免使用if语句。使用case语句,可以使程序流程化,执行起来也比if语句来的快。示例如下:
<%  
     FOR   i   =   1   TO   1000
     n   =   i
     Response.Write   AddSuffix(n)   &   " <br> "
     NEXT
     %>
     <%
     Function   AddSuffix(num)
numpart   =   RIGHT(num,1)
SELECT   CASE   numpart
CASE   "1 "
IF   InStr(num, "11 ")   THEN
num   =   num   &   "th "
ELSE
num   =   num   &   "st "
END   IF
CASE   "2 "
IF   InStr(num, "12 ")   THEN
num   =   num   &   "th "


ELSE
num   =   num   &   "nd "
END   IF
CASE   "3 "
IF   InStr(num, "13 ")   THEN
num   =   num   &   "th "
ELSE
num   =   num   &   "rd "
END   IF
CASE   "4 "
num   =   num   &   "th "
CASE   ELSE
num   =   num   &   "th "
END   SELECT
AddSuffix   =   num
     END   FUNCTION
%>

6、  使用adovbs.inc文件中定义的常量打开记录集


打开记录集时,可以定义记录集打开的游标类型和锁定类型。在adovbs.inc文件中定义了一些常量来定义这些类型。adovbs.inc文件保存在\inetpub\iissamples\IISamples目录下面。下面列举几个常用的游标类型和锁定类型。
游标类型:adOpenFowardOnly游标只能向前;adOpenKeyset游标可向前或者向后,如一用户添加记录,新记录不会出现在记录集中;   adOpenDynamic游标动态随意;adOpenStatic记录集不对其他用户造成的记录修改有所反映。
锁定类型:adLockReadOney不能修改记录集中的记录;adLockPessimistic在编辑一条记录时锁定它;   adLockOptimstic调用记录集Update方法时才锁定记录;adLockBatchOpeimstic记录只能成批更新。
<!--#INCLUDE   VIRTUAL= "/ADOVBS.INC "   -->
<%  
connectme= "DSN=xur;uid=xur;pwd=xur "
sqltemp= "select   *   from   publishers   where   name= 'xur ' "
set   rstemp=Server.CreateObject( "adodb.Recordset ")
rstemp.open   sqltemp,   connectme,   adOpenStatic,adLockOptimstic
response.write   rstemp.recordcount   &   "   records   in <br> "   &   sqltemp
rstemp.close
set   rstemp=nothing
%>

7、  避免在使用global.asa文件中进行对象定义


由于global.asa文件中的内容可以为站点内所有文件引用,无疑,在global.asa文件中进行对象定义可以省去很多重复工作。比如在global.asa中的application_onstart函数中进行如下定义:
<%SUB   application_onstart
set   application( "theCONN ")=server.createobject( "adodb.connection ")
END   SUB   %> ;
这样就可以在站点任何代码中做类似引用:
<%
mySQL= "select   *   from   publishers   where   state= 'xur '
set   rstemp=application( "theconn ").execute(mySQL)
%>
同样地,可以在session_onstart函数中创建记录集对象
<%SUB   session_onstart
set   session( "rstemp ")=server.createobject( "adodb.recordset ")
END   SUB   %>
然后在站点也面中进行如下引用:
<%
mySQL= "select   *   from   publishers   where   state= 'xur '
set   session( "rstemp ")=conntemp.execute(mySQL)
%>
但这样做的同时也有很大的负面影响,由于Application和session变量都只有在关闭网站的时候才释放占用的资源,所以session参数会浪费大量不必要内存,而且此时application变量成为服务器性能的瓶颈。
解决方法:建立定义对象asp页面,在需要进行调用这些对象的页面上,引入这张asp页面。假设定义对象的asp页面名称为define.asp,则只要在对应asp页面中加入以下语句就能引入该页面。
<!--#INCLUDE   VIRTUAL= "/define.asp "   -->
在进行页面引进时,最好在待引进的asp文件中不要包含 <%@LANGUAGE= "VBSCRIPT "%> 语句。因为在asp文件中,只能有一句由@来定义的脚本解析语言。


8、  安全防护


asp   提供了很好的代码保护机制,所有的asp代码都在服务器端执行而只返回给客户端代码执行结果。即便这样,在老版本的IIS中还可以在文件名后面家::$   DATA来查看asp的源代码,这已经属于WebServer安全范畴不在本文讨论范围内。下面提出两点简单的安全注意事项。
  虽然在asp中建议引入文件以inc作为扩展名,在这里仍建议以asp作为引文件的扩展名。当这些代码在安全机制不好的WebServer上运行时,只需在地址栏上输入引入文件的地址(inc为扩展名),就可以浏览该引入文件的内容,这是由于在WebServer上,如果没有定义好解析某类型(比如   inc)的动态连接库时,该文件以源码方式显示。  
  不要把数据库文件放在网站结构内部,这样,当恶意人士获取数据库路径后,就可以轻易获取该数据库,进而肆意更改数据库内容。比较好的做法是,为数据库建立   DSN(DateSource   Name),而在进行数据库访问时直接访问该DSN。  


转http://www.chinaitpower.com/2006Aug/2006-11-05/219229.html


[解决办法]
mark
[解决办法]


精神上支持, 楼主转的帖子对新手来说帮助很大.
骨子里鄙视, 老转载别人的东西...
[解决办法]
感谢楼主的分享
[解决办法]
分享是一种美德
[解决办法]
mark
[解决办法]
只要东西好就行了,还管他是转贴不转贴!
难道说别人用过的钱就不是钱了?
[解决办法]
感谢分享
[解决办法]
帮面
[解决办法]
不错。。

热点排行