日期:2014-05-17  浏览次数:20938 次

经典回顾 :ASP开发准则
应用程序服务器被,或最终将被   Web   服务器所使用,它通常是运行   ASP   页面的   IIS   计算机。ASP   是您的对象的唯一客户机。它带来了专门的线程和安全考虑。

虽然许多使用   ASP   的   Web   站点根本就不用组件,但在这篇文章中假定   ASP   是   Internet   客户机和组件之间的桥梁。下面的   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   是组件的特殊客户机,不同于桌面上的传统单线程   Win32   应用程序。主要区别概括如下。  

线程管理:ASP   是多线程客户机。这意味着可以有许多并发活动一起运行,也许在同一时刻处理不同的   ASP   页面。这说明不能使对象伪称它是唯一的使用者来独占系统。这样做可能有意外的反应,例如,养成一个坏习惯:将对象存储在   ASP   会话或者应用程序变量中。


安全环境:ASP   是由   Web   站点中的   Internet   Information   Services   5.0   执行的,有低、中、高三种隔离度。甚至这些   Web   站点可以有不同的安全设置、允许或拒绝匿名访问、验证客户等等。所有这些设置产生了大量的方案,即不同的用户帐户最终用的是您的对象。


轻松增长:这不是技术问题,而是   Web   应用程序所提供设施的副效应。传统上,为桌面应用程序增加用户基,要求仔细计划好向已知数量客户机的转出。ASP   已经改变了该过程。在启动和运行后,ASP-Visual   Basic   应用程序可以方便地打开,供当地的或世界范围的所有职员、所有业务伙伴和所有客户使用。可以用这种方式描述   —   拥有超链接的单个电子邮件可以使用户基成十倍地增长。您的应用程序为此作好准备了吗?唯一了解的方式是对   Web   站点进行强度测试,以获得实际性能的预期值。关于强度测试的详细信息,请参阅“应用程序生命周期”一节。  
在   ASP   内应该如何使用   Visual   Basic   对象?在页面范围内创建和取消您的对象。也就是说,尽可能使   ASP   页面无状态,只在暂时状态下依赖会话或应用程序变量。不要将对象存储在会话或应用程序变量中。这将   ASP   线程锁定到您的会话、取消所有可伸缩性的预期值。也就是说,Web   服务器处理的用户数不会超过几十个。如果需要在会话或应用程序中存储内容,请使之成为数据而不是对象。

还有可以遵守的许多其他准则。我们建议您阅读   MSDN   Voices   上   J.   D.   Meier   撰写的专栏“Servin '   it   Up”。该专栏包括了大量的技术、实践和技巧,有助于开发可扩展的、可靠的   ASP   和组件应用程序。

参考  

MSDN   Voices:   Servin '   it   Up   Column(英文)
SeminarOnline:在   ASP   下使用自定义   COM   组件(英文)
MSDN   杂志(英文)

不要将引用存储在会话或应用程序中的   VB   对象中
所有   Visual   Basic   6.0   组件都是“单元线程”的,就是说它们都运行在   STA   单元中。这意味着如果在线程中创建对象,那么对该对象的所有调用都必须用同一线程服务。许多线程(来自并发   Web   站点用户)使用   STA   对象的同一实例,会引起一连串的活动,有可能成为应用程序中的瓶颈。

此外,在会话范围内存储用   Server.CreateObject   创建的   STA   对象,可以有效地将执行线程联系到当前用户,从而将应用程序的最大并发用户数限制到默认的   20xN(N   =   处理器数量)。

操作方式  

如果您按照我们的建议使对象无状态,则不需要存储引用以供客户机复用,并在应用程序范围内存储它们。客户机将能够独立创建、使用和取消它们自己的对象。这就减少了保持会话特有对象的需要,原因是它们不保留会话特有的状态。

推荐的方式是使对象无状态