ASP 指南

简介


“Active Server Page (ASP)”应用程序的成功常常取决于对体系结构和设计这两方面的取舍。考虑到 ASP 技术的范围之广和当前应用程序固有的复杂性,这种取舍是非常困难的。本文中,我将为您提供一些特定的指导方针,以助您成功开发基于 ASP 的应用程序。



从过去成功的开发模式经验中,我们总结出以下原则。

我已将指导方针整理成一组开发原则。在评估解决方案和技术时,可以应用以下原则帮助您做出决策。以下原则是我长期以来从成功的开发模式所得的经验积累。

原则 1:采用标准方法

建立命名约定并使目录结构标准化,可以帮助您大大提高 ASP 应用程序的可读性和可维护性。虽然目前尚无 ASP 应用程序的正式标准,许多开发人员还是建立了一些通用方式。在此,我将与您共享一些更为通用的方式。

因为 ASP 技术依靠脚本引擎进行工作,而且脚本具有类型不严密的天性,命名约定也很模糊。在类型非常严密的语言中,变量将按照它的实际类型进行声明。在使用 ASP 技术时,通常按照处理变量的方式(而不是其实际数据类型)在 ASP 代码中声明变量。例如,在使用“Visual Basic(R) Scripting Edition (VBScript)”时,尽管所有的 VBScript 变量都是 Variant,你还是会将成功标志声明为 bSuccess(b 代表布尔型),而不是 vSuccess(v 代表 Variant)。

下表是一些通行的命名约定。

变量前缀:














































前缀 使用的变量 变量示例
b or bln Boolean bSuccess
c or cur Currency cAmount
d or dbl Double dblQuantity
dt or dat Date and Time dtDate
f or flt Float fRatio
l or lng Long lMilliseconds
i or int Integer iCounter牋
s or str String sName
a or arr Array aUsers()
o or obj COM Object oPipeline

数据库对象的变量前缀:






















前缀 使用的变量 变量示例
cnn Connection cnnPubs
rst Recordset rstAuthors
cmd Command cmdEmployee
fld Field fldLastName

范围及前缀的用法:














前缀 说明
g_ 创建于 Global.asa。
m_ 对于 ASP 页或在 Include 文件中是局部的。
(没有前缀) 非静态变量,对于过程来说前缀是局部的

Knowledge Base (KB) 中的一篇文章“Q110264 INFO: Microsoft Consulting Services Naming Conventions for Visual Basic”(英文)对命名约定提供了真知灼见。

尽可能采用目录结构为您的各个应用程序部件提供始终如一的位置。您应用程序的实际目录结构当然由您自己决定,但通常是将图像、文档、include 文件和组件分别放置在单独的目录中。以下是简单 ASP 应用程序目录结构示例。

目录结构示例:

\SimpleAspApp
\Docs
\Images
\Includes

一个好的目录结构允许您有选择地应用 NTFS 权限。您还可以从 ASP 应用程序内部使用相对路径。例如,可以使用以下代码,从位于 SimpleAspApp 目录的 default.asp 页,引用 Includes 目录中的 include 文件 top.asp:

./includes/top.asp

注意我的 include 文件的扩展名是 .asp,而不是 .inc。这样做是出于安全方面的考虑,而且使用 .asp 扩展名(而不是 .inc),还能够在 Visual InterDev(R) 中使用彩色编码。

有关结构化 ASP 应用程序的其他一些提示和技巧,请参阅文章“ASP Conventions”(英文)

原则 2:设计为在服务下运行

ASP 将在服务下运行。设计 ASP 应用程序时,您马上会面临在桌面应用程序中不会遇到的安全环境和线程问题。在桌面环境中,通常只处理作为交互式用户运行的单线程执行,而且有权访问当前的桌面系统。在“Internet 信息服务 (IIS)”中,模拟不同用户环境的多个客户机线程调用您的应用程序,而且您的应用程序被限于“系统”桌面。

这对您来说意味着什么?请学习 IIS 的安全模式。还要提醒您:仅因为某些东西能在 Visual Basic IDE 下能够正常运行,并不意味着它就能在 ASP 技术中安全运行。Visual Basic IDE 并没有准确地模拟运行时环境。常见的设计错误包括:在 ASP 技术中使用需要用户界面的 .OCX 控件,使用对线程来说不安全的组件,和使用要求特殊的用户上下文的组件。要避免的一个最简单的问题,就是从应用程序中试图访问 HKEY_CURRENT_USER (HKCU) 注册表项(例如,不要调用 Visual Basic 的 GetSettingSaveSetting 函数,它们都依赖于 HKCU)。同样,不要出现需要用户进行人机交互的消息框或其他对话框。

以下文章是有关 ASP 技术中的安全和验证问题的相当不错的入门读物:


原则 3:封装商务逻辑

ASP 技术通过生成 HTML 输出提供了表示服务。简而言之,它会生成用户界面。您需要将商务逻辑从 ASP 表示脚本中分隔开来。即使您不使用 COM 组件将商务逻辑从 ASP 代码中分隔开来,至少也要将商务逻辑分隔到函数和 include 文件中,以提高可维护性、可读性和可重用性。在需要排除故障和隔离问题时,您还能体会模块化设计方法的好处。

调用脚本内部调用函数和方法,可避免代码乱作一团,并能在 ASP 应用程序中添加结构。下面举例说明从 ASP 代码中,将逻辑分离到方法调用中:

 lt;% Main()
MyBizMethod()
...
Sub Main()
GetData()
DisplayData()
End Sub
%>

在使用包含 ASP 功能的技术时,可以应用这一原则。下面举一个使用 Visual Basic WebClass 时的例子,说明如何使用这一原则:

  • 因为 WebClass 本身引用 ASP 代码生成 HTML,所以您不要将商务逻辑直接置于 WebClass 内。因为这是您的表示层,不在 MTS/COM+ 下直接运行 WebClass。
  • 从 WebClass,可以调用能运行在 MTS/COM+ 中的单独商务组件。
  • 您可以决定创建自己的、具有对 ASP 引用的 COM 组件,而不是依赖于 WebClass 框架结构和额外的 WebClass 运行时开销 — 您也可以使用 ASP 脚本直接将商务组件自动化。

原则 4:尽晚获取资源,尽早释放资源

常见的问题是,从桌面系统到服务器的过渡。许多具有桌面系统背景的开发人员从来没有为服务器的一些问题和资源共享担心过。在传统的桌面应用程序中,连接到服务器是个耗时的过程。为了改善用户的体验,通常采用尽早获取资源和推迟释放资源的方法。例如,许多应用程序会在它的整个运行时间内始终连接着数据库。

这种方式在传统的桌面应用程序中能够正常工作其原因是用户数量非常明确,容易加以控制,并且后端与前端紧密连接。然而,对于当前的 Web 应用程序,这种方式已经不可行了,其原因是有限的服务器资源将面对越来越多的用户。为了使您的应用程序能够应付用户的增加,您需要尽晚获取资源,尽早释放资源。

共用有助于增加这一方式的有效性。通过共用,多个用户能够共享资源,而且等待时间最少,对服务器的影响也最小。例如,在处理数据库时,ODBC 连接共用和 OLEDB 资源共用可以实现从共用池中选择连接,最大程度地减少连接数据库的开销。

有关共用 ADO 的详细信息,请参阅“Pooling in Microsoft Data Access Components”(英文)

原则 5:使用数据库维护复杂的状态

尽管 HTTP 协议是无状态的,ASP 开发人员还是会经常使用 ASP 功能内置的状态保持机制。例如,使用 ASP 技术内置的 Application 对象,开发人员所保存的资源能够为应用程序的所有用户共享。通过使用 ASP 内置的 Session 对象,开发人员只为单个用户保存资源。

尽管听起来在 ASP 技术的 Session 对象中保存信息是一个非常方便的保持状态的方式,然而这一方式付出的代价太大,而且它也可能成为对可伸缩性的最大的限制因素之一。应用程序的可伸缩性本质上是随着用户数目的增长能够继续保持其性能的能力。而对于每一用户,在会话超时或被放弃之前,Session 对象都会消耗服务器的资源。会话还会将您捆绑到一台服务器上,从而限制您利用 Web 集群的功能。请尽可能不要使用 ASP Session 对象进行状态管理。如果您完全没有使用会话,您就可以禁用 Web 应用程序的 Session 状态(请参阅 IIS 文档)。否则,您可以使用下述语句,针对每一页禁用 Session 状态:

<%@ENABLESESSIONSTATE=False %>

对于一些简单的数据,您可以使用 QueryString cookie 或隐藏的窗体域保持 ASP 请求间的状态。然后,对于更为复杂的信息,通常推荐您使用数据库。一般所采用的方式是生成某一特有的标识符,然后发送到每一个发出请求的客户机,并保存为隐藏的窗体域。在随后的请求中,这一特有的标识符被用于在数据库中查找与该用户相关的状态信息。这一方式提供了更高的可伸缩性和更为简洁明了的代码。

有关使用 QueryString cookie 和隐藏的窗体域的详细信息,请参阅“Q175167 HOWTO: Persisting Values Without Sessions”(英文)

原则 6:使用 Server.CreateObject 创建对象

在创建 ASP 技术的对象时,您可以选择 <OBJECT> 标记、Server.CreateObjectCreateObject 三种方式。每项技术的行为略有不同。尽管在 IIS 4.0 中,使用 <OBJECT> 标记或 CreateObjectServer.CreateObject 略具性能优势,我们一般还是推荐使用 Server.CreateObject, 以便于 ASP 应用程序认知您的对象。(注意在 IIS 5.0 中,前两项与 Server.CreateObject 相比,已经没有性能优势。)

<OBJECT> 标记仅在调用第一个方法时才会创建组件,因此能够节省资源。Server.CreateObject 使用 ASP 技术内置的 Server 对象创建组件。实质上,它只是执行了 CoCreateInstance,但是 ASP 却能够认知这一对象。同时,还将调用 ASP 技术的传统的 OnStartPageOnEndPage。(注意最好在 IIS 4.0 或者更高版本中使用 ObjectContext)。如果您只是使用 CreateObject,您将越过 ASP 技术而直接使用 Scripting 引擎。

以下是一个可能出现的例外情况:当您通过防火墙进行调用时,您可能需要调用 CreateObject 而不是 Server.CreateObject。详细信息,请参阅“Q193230 - PRB: Server.CreateObject Fails when Object is Behind Firewall”(英文)

原则 7:提供丰富的疑难解答信息

确保在您所有的 ASP 应用程序中都包含了错误处理过程。而且,确保您提供了有用的诊断信息。我还没有碰到有哪个人抱怨错误信息太具有说明性了。请确保在错误日志中包含以下信息:

  • 用户上下文(如果您正在使用组件,您可以调用 GetUserName
  • 线程 ID(在组件中,可以调用 GetCurrentThreadId)<
  • 时间
  • 完整的错误信息(包括编号、来源和说明)
  • 参数值

因为将在 ASP 下运行,您可能希望将这些信息写到文件或 NT 的事件日志。您还可以创建记录关键的应用程序事件的应用程序事件日志,以备诊断应用程序错误时使用。

以下文章提供了有关错误处理技术的详细信息:


原则 8:测试性能、可伸缩性和可靠性

浏览器并不是准确的测试方式,它只能向您展示应用程序可能的用途。请针对您的应用程序设置特定的性能目标,并使用 Web Application Stress Tool 等负载工具进行压力测试。您需要自己决定您的环境所能接受的条件,以下是一些帮助您启动测试过程的通用指导方针:

  • 通过测试 ASP 每秒钟的请求数对性能进行测试,并建立一个最小的阈值。一般情况下,不执行数据库访问的简单 ASP 页每秒钟至少应返回 30 页。调用组件或访问数据库的页每秒钟至少返回 25 页。
  • 向应用程序不停地追加用户,直到每秒钟的请求数低于预先设置的阈值,用这种方式测试可伸缩性。
  • 从 Web 集群中移去机器,并检查错误和故障情况,以便测试可靠性。

将测试环境与实际运行的环境相匹配,甚至防火墙也不例外。这听起来代价很高,但我曾经听说过开发人员因为没有考虑到防火墙,而丢失了工作。

有关使用 Web Application Stress Tool 测试 ASP 应用程序的详细信息,请参阅“I Can't Stress It Enough -- Load Test Your ASP Application”(英文)

原则 9:增加隔离性

使用隔离功能保护您的应用程序过程能够极大地增强服务器的稳定性。谈到 Internet 应用程序,是否使用隔离功能的后果可能会有巨大的差别:一个是应用程序崩溃,一个是服务器当机。保护主 IIS 进程 (InetInfo.exe) 通常会排在优先级列表的较高位置。在您使用组件时,这一点尤为突出。

通常所采用的保护主 ISS 进程的技术是使 Web 应用程序运行在各自的内存空间中。在 Internet Services Manager 中,您可以针对每一个 Web 设置这一选项。虽然因对进程进行编组而开销的系统资源会对性能有些微的影响,但对应用程序所起的保护作用值得付出这一代价。 在 IIS 4.0 下,您可以采用进程内 (in-process) 和进程外(out-of-process,OOP)两种方式运行应用程序。OOP 应用程序会运行在新的 Mtx.exe 实例中。在 IIS 5.0 下,您还能使用其他的隔离选项。可以将隔离级别设置为“低”(对 Inetinfo.exe 来说是进程内应用程序)、“中”(DllHost.exe 共享实例)或“高”(Dllhost.exe的非共享实例)。

除了将 Web 应用程序隔离在它们自己的内存空间中之外,您可能还希望隔离不信任的组件。不信任的组件通常是在实际环境中没有通过测试时间的考验的组件。您可以在 Server 包中运行这些组件,这样它们会运行在新的 Dllhost.exe 实例中。

一般而言,如果要在性能和保护措施之间采取中庸之道,方式如下:在“高”隔离状态运行 Web 应用程序,在库包中运行组件。这种方式最大限度地减少了编组开支,同时在进程之间提供了最强的保护作用。

详细信息,请参阅文章“Server Reliability Through Process Isolation”(英文)

原则 10:不要滥用线程共用组

在 IIS 4.0 下,针对每个受 MTS 管理的处理器,ASP 的默认共用组是 10 个线程。在 IIS 5.0 中,默认值是 20。这就意味着每一线程都是一份潜在的宝贵资源,能够处理多个客户机请求。您同样需要避免调用会出现阻塞的方法,如进行大的数据库调用。如果您有要执行这种操作的工作,它将阻止 ASP 应用程序将响应快速返回到客户机,则请考虑使用队列功能。例如,在 NT 4.0 中,可以使用 MSMQ。在 Windows 2000 中,可以使用 Queued Components(排队组件)。

在会话中不要存储 Single-threaded Apartment (STA) 组件,这种方式的一个共同缺陷是会填满会话范围中的 Visual Basic 对象。会将用户锁定到某一线程,与线程共用组的目的背道而驰。潜在的用户会被阻塞在其他用户的后面,等待创建他们组件的线程变得有效。您应该采用别的方式,设计能基于每一页进行创建和破坏的无状态组件。

快速提示:确保已在服务器上禁用了 ASP Script Debugging 功能(使用 Internet Services Manager)。如果启用了 ASP Script Debugging,则 ASP 的执行过程将被锁定到某一线程。

详细信息,请参阅以下文章:


摘要

创建 ASP 应用程序需要相当宽广的知识面。ASP 应用程序所面临的一个挑战是目前没有通用的规则(这也正是乐趣的一部分)。另外一个问题是许多开发人员接触 Internet 开发之前是从事桌面系统的开发工作。通过在您的 ASP 开发工作中应用上述规则,您有希望避免犯下代价巨大的错误,并能开发出相当不错的 ASP 应用程序。


J.D. Meier 出生并成长于美国东海岸。听从 Horace Greeley 的建议,他成为一名开发人员支持工程师,主要致力于包括 MTS 和 ASP 技术在内的服务器端组件以及 Windows DNA 应用程序。

(0)

相关推荐

  • ASP 指南

    简介 "Active Server Page (ASP)"应用程序的成功常常取决于对体系结构和设计这两方面的取舍.考虑到 ASP 技术的范围之广和当前应用程序固有的复杂性,这种取舍是非常困难的.本文中,我将为您提供一些特定的指导方针,以助您成功开发基于 ASP 的应用程序. 从过去成功的开发模式经验中,我们总结出以下原则. 我已将指导方针整理成一组开发原则.在评估解决方案和技术时,可以应用以下原则帮助您做出决策.以下原则是我长期以来从成功的开发模式所得的经验积累. 原则 1:采用标准方

  • ASP.NET微信开发(接口指南)

    公众平台用户提交信息后,微信服务器将发送GET请求到填写的URL上,并且带上四个参数: 开发者通过检验signature对请求进行校验(下面有校验方式).若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败. signature结合了开发者填写的token参数和请求中的timestamp参数.nonce参数. 加密/校验流程: 1. 将token.timestamp.nonce三个参数进行字典序排序 2. 将三个参数字符串拼接成一个字符串进行sha1加密

  • ASP.NET Core 3.0迁移的完美避坑指南

    一.前言 .NET Core 3.0将会在 .NET Conf 大会上正式发布,截止今日发布了9个预览版,改动也是不少,由于没有持续关注,今天将前面开源的动态WebApi项目迁移到.NET Core 3.0还花了不少时间踩坑,给大家分享一下我在迁移过程中遇到的坑.迁移的版本是当前Release最新版本 .NET Core 2.2 到 .NET Core 3.0 Preview 9. 二.ASP.NET Core 项目迁移 官方迁移文档:从 ASP.NET Core 2.2 迁移到3.0 ,这个官

  • ASP个人网站与动网整合非官方方法

    虽然动网已提供有详细的"动网论坛系统Api接口开发人员指南",但像我这样的菜鸟一时半会可是参详不透的,汗.不甘心,在对其登录.验证等函数进行一番研究再加以测试后最终竟也小有所成,菜鸟也有菜鸟的办法: 本次测试的论坛版本为Version 7.1.0 Sp1,未对其他版本做进行测试 一.网站文件结构 wwwroot    ┝ index.asp    ┝ CheckUserLogin.asp    ┕ bbs/ 二.整合原理 对于同步更新实现不困难,整合主要问题就是难在同步登录,所以我们的

  • ASP类型网站结合动网论坛会员的方法第1/3页

    个人网站如有会员注册模块+动网论坛的话,那网站要与动网论坛系统整合,实现不同Web系统之间的用户信息同步更新.登录等操作就不是件容易的事了,虽然动网已提供有详细的"动网论坛系统Api接口开发人员指南",但像我这样的菜鸟一时半会可是参详不透的,汗.不甘心,在对其登录.验证等函数进行一番研究再加以测试后最终竟也小有所成,菜鸟也有菜鸟的办法,哈哈. 一.网站文件结构 wwwroot   ┝ index.asp   ┝ CheckUserLogin.asp   ┕ bbs/ 二.整合原理 对于

  • ASP.NET中保护自定义的服务器控件

    自定义服务器控件是扩展 ASP.NET Web 服务器控件的功能的一种方式.下文提供了针对自定义服务器控件的用户和开发人员的基本安全准则.有关创建自定义服务器控件的更多信息,请参见开发自定义 ASP.NET 服务器控件. IDE(如 Microsoft Visual Studio 2005)简化了自定义控件的使用及开发.但是,无论使用哪一 IDE,下面列出的安全准则均适用. 有关 ASP.NET Web 应用程序安全性的常规信息,请参见 ASP.NET Web 应用程序安全性. 针对自定义服务器

  • asp,asp.net学习教程下载

    XML与ASP网站实作大全 ASP经典百例 ASP.NET 1.1专业开发 ASP.NET完全手册 ASP.NET 技术参考 ASP.netdatabase开发圣经 ASP数据库系统开发实例导航 怎样用ASP和COM进行Web编程 Asp.Net技术文档 ASP Net密技集錦(C#) 即时应用ASP脚本第二版 简单易学的ASP教程 ASP开发中的错误信息中文说明大全 10天学会ASP ASP中文使用手册 ASP.NET服务器控件高程 ASP.NET 实用全书 ASP 3.0高级编程 ASP.N

  • ASP.NET Internet安全Forms身份验证方法

    本文分别以ASP.NET1.1与ASP.NET2.0在Forms 身份验证上的实现方法,以及ASP.NET2.0较上一版本有哪些改进或变化进行说明.相信读者都己经看过许多类似这样的文章,不伦是在网上或是某些专业书籍上,最近又有模式&实践小组成员发布WCF安全模型指南,可见构建网站安全总是不过时的话题,作者认为此文也绝对是您应该收藏的参考资料. ASP.NET 安全性的工作原理 网站在安全性方面有一个常见的要求:特定的页面仅允许某些成员或其他经过身份验证的用户浏览.充分利用Forms身份验证是最好

  • 白刃之战:PHP vs. ASP.NET(节选)-架构比较

    作者:Robert Lair and Jason Lefebvr Intensity Software, Inc. 翻译:EasyChen Exlcsoft.com 概观 开发界正在进行的一个争论是PHP和ASP中哪一个平台更适合网站开发.这场争论由于微软的ASP.net带来的巨大变化而进入了新时期.和ASP 3.0比起来,ASP.NET采用了全新的设计,有着很多新的特性和优点.究竟ASP.NET 会给PHP和ASP之间的争论带来什么样的影响呢?本文将为你提供这个问题的答案的相关信息. 架构比较

  • 在ASP.NET 2.0中操作数据之二十八:GridView里的Button

    导言 一般控件(比如GridView)显示数据的时候对数据只能读取,而需要处理数据的功能是非常常见的.典型的情况是为每行数据添加一个Button, LinkButton, 或ImageButton . 当点击这些button时,数据会PostBack,执行一些服务器端的代码. 一条条的编辑或删除数据是最常见的情况.实际上,编辑和删除是如此常见,从概述插入.更新和删除数据 开始, 我们可以看到GridView, DetailsView, 和 FormView可以零代码的完成这些功能. 除了编辑和删

随机推荐