教你写出优秀的ASP应用

  • 来源: 互联网 作者: 若水   2008-05-04/17:23
  • 怎样创建鲁棒性、正确性、可维护性和性能俱佳的ASP应用程序?要做什么?不做什么?本文以提纲的形式,给出了主要的Check-Points(检查点)。

    什么是ASP

    Active Server Page,简称ASP,是:

    . 连接网友界面(HTML)和商业逻辑(Business Logic);
    . 提供一致的、容易使用的、有状态保持的、基于WEB的客户端;
    . 为那些需要事务处理的WEB 应用提供应用程序环境。

    ASP不是

    . 实现商业逻辑(Business Logic)的地方;商业逻辑应该通过COM+、MTS或者数据库来实现。

    ASP的使用者应该有下面的教训

    . 开发应用程序,而不是开发一个一个的孤立ASP页面;
    . 对输入和输出进行缓存;
    . 在发布之前要测试;
    . 选择性能较好的部件;
    . 减少数据库的存取:缓存变换后的结果;
    . 使用MSMQ来处理有时间延迟的工作;

    站点设计

    . 你的站点想提供什么?
    . 信息架构:80/20准则;
    . 站点导航;
    . 页面布局;
    . 可用性;
    . 使用ALT和Title属性;
    . 不使用图片或者Image Map的导航;
    . 适合大多数低版本浏览器,考虑他们对ActiveX、RDS、XML、DHTML、Java Applet的支持状况;
    . 屏幕分辨率和屏幕颜色数
    . 是否支持WebTV、PDA…?
    . 设置IMG的width和height属性。
    . 非浏览器的访问,如自动机器人(Spider);
    . 使用帧(Frame)?
    . 使用Cookies的个性化;
    . 避免坏连接;
    . 使用meta标签;
    . 内容审核;
    . 内容检索;
    . 结果反馈:用户反馈和跟踪;
    . 减少下载时间;

    三层、四层应用设计

    可读性、可维护性

    . 使用注释;
    . 在VBScript脚本中使用<%Optio. Explicit%>;
    . 使用字符串变量存储SQL字符串:便于调试;
    . 使用Server.MapPath和相对路径;
    . 使用ADODB.INC或者<!—metadata typelib=somelib file=somedll-->来引用常量,不要直接使用常量数值。
    . 指定ADO调用的缺省参数,避免出错;
    . 使用库或者部件来封装代码。


    正确的方法

    . 使用Server.URLEncode
    . 错误捕获和处理

    国际化

    . 使用<%CodePage%>
    . 使用Session.CodePage
    . 在IIS5.0中,Response.write支持UTF8

    其他

    . 使用#include 重用代码
    . 使用分页技术

    站点安全

    . 客户身份验证
    . 输入验证
    . #include 文件不要使用.INC后缀,使用.ASP或者设置.INC的应用程序映射
    . 把MDB文件存放在非WEB路径下;
    . 使用ADSI做安全管理


    Session和Application状态

    Session的使用

    . 使用起来很方便但是很有问题;
    . HTTP是一个无状态的协议;
    . 设计购物推车特别有用;
    . 不利于可伸缩性设计(Scalability);
    . 在不需要Session的页面中使用<%EnableSessionState=false%>
    . 尽可能完全避免使用Session;
    . 在多个web服务器情况下不适合;
    . 某些部件使Session运行在单一线程模式,减少了吞吐量;
    . 消耗内存;
    . Session有超时的问题
    . 需要客户端的浏览器打开cookie设置;
    . 不要在session中保存recordset,或者缓存connection对象;
    . 在global.asa不要使用空的Session_OnEnd;
    . 可选方案:
    . cookies
    . 直接状态编码:简单、容易、不安全
    . 后端数据库的ID作为状态值
    . querystring 参数
    . 如amazon的url方式
    . 隐藏的表单

    Application变量

    . 共享变量
    . 不能持久保存
    . 多个web服务器时不行,除非只是只读变量。

    缓存

    . 对静态内容非常理想
    . 不要使用Response.Expires=0,使用负数:
    . Response.Expires=-10000;
    . Response.AddHeader “Pragma”,”no-cache”
    . Response.AddHeader “cache-control”,”no-store”
    . 服务器缓存
    . proxy缓存
    . 客户端缓存

    部件

    . 性能
    . 伸缩性
    . 分离商务逻辑和页面表现
    . 被ASP或其他环境重用
    . 事务处理
    #p#分页标题#e#. 类型安全
    . 存取操作系统特性
    . 保护知识产权
    . 在下列情况下使用Server.CreateObject:
    . MTS事务处理
    . 上下文安全性
    . ASP内部部件
    . OnStartPage、OnEndPage
    . 使用<Object RunAt=server>延迟对象初始化
    . 是否保存到Session或者Application变量中


    性能

    . Response缓冲:Response.Buffer=True
    . 关闭Connection并:set Connection=Nothing
    . 使用局部变量
    . 用<Object >代替Server.CreateObject
    . 不要使用Session和Application变量
    . 不要将COM对象存储在Session或者Application变量中
    . 关闭脚本调试
    . 避免重复的字符串相加
    . 在费时的页面顶端使用Response.IsClientConnected
    . 使用MSMQ
    . 不要在Session或者Application中存储大数组
    . 不要ReDim 数组
    . 将集合类型的对象赋给临时变量
    . 减小微处理器的最大线程数(运行regedt32,在HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Services\w3SVC\ASP\Parameters,增加ProcessorThreadMax,减小这个值,看看性能的变化;或者增大这个值。)
    . 设置AspScriptEngineCacheMax,使它等于ProcessorThreadMax*CPU个数。缺省的是30;(在系统路径下:\system32\inetsrv/adminisamples下,键入adsutil.vbs,设置/w3svc/AspScriptEngineCacheMax);
    . 减少Session.Timeout;
    . 在MMC中,设置ASP应用程序缓冲为有效。


    把某些工作交给客户端

    . CSS、DHTML
    . XML
    . RDS
    . Remote Scripting
    . Xmlhttp
    . 客户端验证
    . 减小文件大小
    . 尽可能避免https和SSL
    . 使用Response.End测试性能

    数据库

    . 减少数据库存取访问;
    . 缓存变换后的结果;
    . 使用ODBC连接池和OLEDB资源池;
    . 使用系统DSN或者非DSN,不要使用DSN或者文件DSN;
    . 使ADO运行在双线程模式(Both-threaded):makefre.bat;
    . 使用ADO的Field对象;
    . GetString或者GetRows比较快;
    . RDS和XML把负载嫁到客户端;
    . 不要使用Select *,把字段写出来;
    . 尽量使用SQ. Server 7,不要使用Access;
    . 使用SQ. Server的特性:存储过程、Job、Join、sort、group
    . 使用SQ. Analysis,优化SQL的性能
    . 使用索引
    . 本地使用Name-pipes,远程使用Sockets
    . 准确地指定Command Type

    IIS 5的新特性

    . 可靠的重新启动
    . ASP性能提高
    . Server.Transfer比Server.Redirect更好
    . Server.Execute
    . Server.GetLastError


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多