应用程序服务器被,或最终将被 Web 服务器所使用,它通常是运行 ASP 页面的 IIS 计算机。ASP 是您的对象的唯一客户机。它带来了专门的线程和安全考虑。
虽然许多使用 ASP 的 Web 站点根本就不用组件,但在这篇文章中假定 ASP 是 Internet 客户机和组件之间的桥梁。下面的 asp/server01242000.asp">ASP 组件准则(英文)提供
ASP 和组件之间的划分服务
ASP 最常用于在服务器上创建供客户机使用的 HTML 或 XML 文件,因此我们主要讨论这种使用方案。这就引出了一个常见的问题,如果 ASP 页面在服务器上,那么它们是否属于业务层的一部分呢?在组件世界中,答案通常是否。虽然 ASP 确实在服务器上运行,而且可能与应用程序服务器在同一个空间,但是这不能使它成为业务逻辑的一部分。
随着用户界面工具的发展或者随着启用更多的业务对业务方案,拥有这种明确的区别将获得巨大的回报。
话说到此,让我们来看一些最重要的业务层和表示层划分准则:
ASP 存在于服务器上,因此 ASP 页面必须符合资源共享规则,并且记住可伸缩性。请看下面的详细内容:
操作方式
在评价某个代码段是否属于业务逻辑或者表示层时,请问一下自己,“如果我必须用按键式电话应用程序代替我的 ASP 页面,那么该代码是否还有用?”如果答案为“是”,那么可以尝试将它划分为业务逻辑代码或者用户界面帮助器代码。
如果改变了客户机后该代码不能用,或者如果它是构造用户界面的帮助器,则该代码属于表示服务层。它在 ASP 页面中,或在使用 ASP 内部组件的组件中。它不属于业务对象组件。
理解桌面与 ASP 客户机的区别
ASP 是组件的特殊客户机,不同于桌面上的传统单线程 Win32 应用程序。主要区别概括如下。
在 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 6.0 组件都是“单元线程”的,就是说它们都运行在 STA 单元中。这意味着如果在线程中创建对象,那么对该对象的所有调用都必须用同一线程服务。许多线程(来自并发 Web 站点用户)使用 STA 对象的同一实例,会引起一连串的活动,有可能成为应用程序中的瓶颈。
此外,在会话范围内存储用 Server.CreateObject 创建的 STA 对象,可以有效地将执行线程联系到当前用户,从而将应用程序的最大并发用户数限制到默认的 20xN(N = 处理器数量)。
操作方式
如果您按照我们的建议使对象无状态,则不需要存储引用以供客户机复用,并在应用程序范围内存储它们。客户机将能够独立创建、使用和取消它们自己的对象。这就减少了保持会话特有对象的需要,原因是它们不保留会话特有的状态。
推荐的方式是使对象无状态,它在需要时访问数据库或其他存储区(例如 cookies 和 LDAP)。
如果需要使用会话或应用程序范围的数据,请将数据,而不是处理数据的对象,存储在此。您可以创建一个类,来封装对所需值的处理。
参考
asp">信息:不要在会话或应用程序中存储 STA 对象 (Q243543)(英文)
PRB:将 STA COM 组件存储在会话中,会将会话锁定在单线程中 (Q243815)(英文)
信息:ASP 下的组件线程模型概要 (Q243544)(英文)
学习 IIS 5.0 中的新内容
Internet Information Server 5.0 增加了许多新功能。这些改进均已写入 J.D. Meier 的 MSDN 文章中:asp/server02282000.asp">沿用 IIS 5.0 中的 ASP(英文)。下面是该文中最重要改进的概述。