应用程序服务器被或最终将被 Web 服务器所使用它通常是运行 ASP 页面的 IIS 计算机ASP 是您的对象的唯一客户机它带来了专门的线程和安全考虑
虽然许多使用 ASP 的 Web 站点根本就不用组件但在这篇文章中假定 ASP 是 Internet 客户机和组件之间的桥梁下面的 asp/serverasp\>ASP 组件准则(英文)提供
ASP 和组件之间的划分服务
ASP 最常用于在服务器上创建供客户机使用的 HTML 或 XML 文件因此我们主要讨论这种使用方案这就引出了一个常见的问题如果 ASP 页面在服务器上那么它们是否属于业务层的一部分呢?在组件世界中答案通常是否虽然 ASP 确实在服务器上运行而且可能与应用程序服务器在同一个空间但是这不能使它成为业务逻辑的一部分
随着用户界面工具的发展或者随着启用更多的业务对业务方案拥有这种明确的区别将获得巨大的回报
话说到此让我们来看一些最重要的业务层和表示层划分准则
令 UI 代码与业务逻辑分离这包括编写与 UI 耦合的代码例如使用 ASP 内部组件的 MTS 对象让它与业务逻辑代码分离如同在不同的 DLL 中
将事务与 ASP 页面分离事务 ASP 在某些情况下非常好但是组件和多层应用程序会改变这种情况组件不应该依赖由客户机层来管理它们的事务和业务逻辑语义
将表示组件(使用请求和响应的组件)与 Web 服务器放在相同的机器和/或进程中如果将使用 ASP 内部组件对象的对象放在远程机器上那么对内部组件的所有调用将以回调形式发生调用 IIS 客户机的是 COM+ 服务器它显着降低了性能并使安全配置复杂化可以将这些调整对象放在标记为库激活的 COM+ 应用程序中
ASP 存在于服务器上因此 ASP 页面必须符合资源共享规则并且记住可伸缩性请看下面的详细内容
在会话中管理应尽量避免用户特定的状态
保持 ASP 无状态并在可能的情况下允许资源池
操作方式
在评价某个代码段是否属于业务逻辑或者表示层时请问一下自己如果我必须用按键式电话应用程序代替我的 ASP 页面那么该代码是否还有用?如果答案为是那么可以尝试将它划分为业务逻辑代码或者用户界面帮助器代码
如果改变了客户机后该代码不能用或者如果它是构造用户界面的帮助器则该代码属于表示服务层它在 ASP 页面中或在使用 ASP 内部组件的组件中它不属于业务对象组件
理解桌面与 ASP 客户机的区别
ASP 是组件的特殊客户机不同于桌面上的传统单线程 Win 应用程序主要区别概括如下
线程管理ASP 是多线程客户机这意味着可以有许多并发活动一起运行也许在同一时刻处理不同的 ASP 页面这说明不能使对象伪称它是唯一的使用者来独占系统这样做可能有意外的反应例如养成一个坏习惯将对象存储在 ASP 会话或者应用程序变量中 [Page]
安全环境ASP 是由 Web 站点中的 Internet Information Services 执行的有低中高三种隔离度甚至这些 Web 站点可以有不同的安全设置允许或拒绝匿名访问验证客户等等所有这些设置产生了大量的方案即不同的用户帐户最终用的是您的对象
轻松增长这不是技术问题而是 Web 应用程序所提供设施的副效应传统上为桌面应用程序增加用户基要求仔细计划好向已知数量客户机的转出ASP 已经改变了该过程在启动和运行后ASPVisual Basic 应用程序可以方便地打开供当地的或世界范围的所有职员所有业务伙伴和所有客户使用可以用这种方式描述 — 拥有超链接的单个电子邮件可以使用户基成十倍地增长您的应用程序为此作好准备了吗?唯一了解的方式是对 Web 站点进行强度测试以获得实际性能的预期值关于强度测试的详细信息请参阅应用程序生命周期一节
在 ASP 内应该如何使用 Visual Basic 对象?在页面范围内创建和取消您的对象也就是说尽可能使 ASP 页面无状态只在暂时状态下依赖会话或应用程序变量不要将对象存储在会话或应用程序变量中这将 ASP 线程锁定到您的会话取消所有可伸缩性的预期值也就是说Web 服务器处理的用户数不会超过几十个如果需要在会话或应用程序中存储内容请使之成为数据而不是对象
还有可以遵守的许多其他准则我们建议您阅读 MSDN Voices 上 J D Meier 撰写的专栏Servin it Up该专栏包括了大量的技术实践和技巧有助于开发可扩展的可靠的 ASP 和组件应用程序
参考
asp#server\>MSDN Voices Servin it Up Column(英文)
SeminarOnline在 ASP 下使用自定义 COM 组件(英文)
asp\>MSDN 杂志(英文)不要将引用存储在会话或应用程序中的 VB 对象中
所有 Visual Basic 组件都是单元线程的就是说它们都运行在 STA 单元中这意味着如果在线程中创建对象那么对该对象的所有调用都必须用同一线程服务许多线程(来自并发 Web 站点用户)使用 STA 对象的同一实例会引起一连串的活动有可能成为应用程序中的瓶颈
此外在会话范围内存储用 ServerCreateObject 创建的 STA 对象可以有效地将执行线程联系到当前用户从而将应用程序的最大并发用户数限制到默认的 xN(N = 处理器数量)
操作方式
如果您按照我们的建议使对象无状态则不需要存储引用以供客户机复用并在应用程序范围内存储它们客户机将能够独立创建使用和取消它们自己的对象这就减少了保持会话特有对象的需要原因是它们不保留会话特有的状态 [Page]
推荐的方式是使对象无状态它在需要时访问数据库或其他存储区(例如 cookies 和 LDAP)
如果需要使用会话或应用程序范围的数据请将数据而不是处理数据的对象存储在此您可以创建一个类来封装对所需值的处理
参考
asp\>信息不要在会话或应用程序中存储 STA 对象 (Q)(英文)
PRB将 STA COM 组件存储在会话中会将会话锁定在单线程中 (Q)(英文)
信息ASP 下的组件线程模型概要 (Q)(英文)
学习 IIS 中的新内容
Internet Information Server 增加了许多新功能这些改进均已写入 JD Meier 的 MSDN 文章中asp/serverasp\>沿用 IIS 中的 ASP(英文)下面是该文中最重要改进的概述
改进的出色的性能
ServerTransfer 和 ServerExecute 方法
集中式错误处理
改进的浏览器功能
改进的脚本引擎
正则表达式分析器
与 ADO 记录集 XML 功能的集成
新的安全性缓沖隔离和管理功能