如何写出优秀的ASP应用
怎样创建鲁棒性、正确性、可维护性和性能俱佳的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或其他环境重用
. 事务处理
. 类型安全
. 存取操作特性
. 保护知识产权
. 在下列情况下使用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_machinesystem currentcontrolsetservicesw3svcaspparameters,增加processorthreadmax,减小这个值,看看性能的变化;或者增大这个值。)
. 设置aspscriptenginecachemax,使它等于processorthreadmax*cpu个数。缺省的是30;(在系统路径下:system32inetsrv/adminisamples下,键入adsutil.vbs,设置/w3s/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