ASP.NET 初学者入门






4.61/5 (93投票s)
2003年7月2日
18分钟阅读

913335
一篇关于ASP.NET基础介绍的文章,涵盖其底层技术以及ASP.NET相对于ASP的优势。
引言
我看了很多ASP.NET的教程,但大多数都直接从编码和编写你的第一个ASP.NET程序开始。但我写这篇教程是为了解释为什么在经典的ASP运行良好的情况下还需要ASP.NET,ASP.NET背后的底层技术是什么,以及ASP.NET为程序员提供了什么样的编程模型。现在,让我们开始吧。
ASP.NET是微软为Web开发者提供的新产品。它不仅仅是下一代ASP;事实上,它是一项经过彻底重新设计和增强的技术,比传统的ASP提供了更多、更多的功能,并且可以显著提高生产力。
因为它起源于ASP,ASP.NET看起来与它的前身非常相似——但只是初看时。有些项目看起来非常熟悉,让人想起ASP。但是像Web Forms、Web Services或Server Controls这样的概念赋予了ASP.NET构建真正的Web应用程序的能力。
回顾:Active Server Pages (ASP)
Microsoft Active Server Pages (ASP) 是一种服务器端脚本技术。ASP是微软创建的一项技术,旨在简化交互式Web应用程序的开发。使用ASP,你可以使用客户端脚本和服务器端脚本。也许你想验证用户输入或访问数据库。ASP为事务处理和管理会话状态提供了解决方案。ASP是Web开发中最成功的语言之一。
传统ASP的问题
如果考虑到当今强大Web应用程序的需求,ASP存在许多问题。
- 解释型和弱类型代码
ASP脚本代码通常用JScript或VBScript等语言编写。Active Server Pages依赖的脚本执行引擎会在每次调用页面时逐行解释代码。此外,虽然支持变量,但它们都是弱类型变体,仅在代码运行时才绑定到特定类型。这两个因素都阻碍了性能,类型的后期绑定使得在编写代码时更难捕获错误。
- 混合布局(HTML)和逻辑(脚本代码)
ASP文件经常将脚本代码与HTML结合。这导致ASP脚本冗长、难以阅读,并且经常在代码和HTML之间切换。HTML与ASP代码的交织对于大型Web应用程序尤其成问题,在这些应用程序中,内容必须与业务逻辑分开。
- 有限的开发和调试工具
Microsoft Visual InterDev、Macromedia Visual UltraDev和其他工具试图通过提供图形开发环境来提高ASP程序员的生产力。然而,这些工具从未像Microsoft Windows应用程序开发工具(如Visual Basic或Microsoft Access)那样达到易用性或接受程度。ASP开发人员仍然严重依赖或完全依赖记事本。
调试是任何软件开发过程中不可避免的一部分,而ASP的调试工具非常有限。大多数ASP程序员
会选择在代码中嵌入临时的Response.Write语句来跟踪其执行进度。
- 没有真正的状态管理
只有当客户端浏览器支持Cookie时,会话状态才会被维护。只能使用ASP Session对象来保存会话状态信息。如果您想识别用户,例如,您需要实现额外的代码。
- 仅在服务器关闭时更新文件
如果您的Web应用程序使用了组件,则只能在Web服务器停止时将新文件复制到应用程序。否则,这就像将地毯从应用程序脚下抽走一样,因为组件可能正在使用中(并被锁定)且必须注册。
- 晦涩的配置设置
ASP Web应用程序的配置信息(如会话状态和服务器超时)存储在IIS元数据库中。由于元数据库以专有格式存储,因此只能在服务器计算机上使用Internet服务管理器等实用程序进行修改。由于对以编程方式操作或提取这些设置的支持有限,因此将ASP应用程序从一台服务器移植到另一台服务器通常是一项艰巨的任务。
介绍ASP.NET
ASP.NET的开发是为了直接解决开发人员在使用经典ASP时遇到的问题。由于ASP的广泛使用,微软确保ASP脚本可以在安装了.NET Framework的计算机上无需修改即可执行(安装.NET Framework时不会修改ASP引擎ASP.DLL)。因此,IIS可以在同一台计算机上托管ASP和ASP.NET脚本。
ASP.NET的优势
- 代码与HTML分离
为了彻底改变,ASP.NET使您能够完全分离布局和业务逻辑。这使得程序员和设计师团队能够更轻松地高效协作。这使得程序员和设计师团队能够更轻松地高效协作。
- 支持编译语言
开发人员可以使用VB.NET并访问强类型和面向对象编程等功能。使用编译语言也意味着ASP.NET页面不会遭受与解释型代码相关的性能损失。ASP.NET页面被预编译为字节码,并在首次请求时进行即时(JIT)编译。后续请求将定向到完全编译的代码,直到源更改为止,该代码都会被缓存。
- 使用.NET Framework提供的服务
.NET Framework提供了可以被您的应用程序使用的类库。其中一些关键类可以帮助您进行输入/输出、访问操作系统服务、数据访问,甚至调试。在本模块中,我们将对其中一些进行更详细的介绍。
- 图形化开发环境
Visual Studio .NET为Web开发人员提供了非常丰富的开发环境。
您可以像在Visual Basic 6中一样拖放控件并设置属性。并且您不仅对代码,而且对HTML和XML都拥有完整的IntelliSense支持。
- 状态管理
为了解决之前提到的问题,ASP.NET为会话和应用程序状态管理提供了解决方案。例如,状态信息可以保存在内存中或存储在数据库中。它可以跨Web场共享,并且即使服务器发生故障或连接中断,状态信息也可以恢复。
- 服务器运行时更新文件!
您的应用程序的组件可以在服务器在线且客户端已连接的情况下进行更新。框架将在新文件复制到应用程序后立即使用它们。已删除或仍在使用的旧文件将在客户端完成之前保留在内存中。
- 基于XML的配置文件
ASP.NET中的配置设置存储在XML文件中,您可以轻松读取和编辑。您也可以轻松地将它们复制到另一台服务器,以及构成您的应用程序的其他文件。
ASP.NET概述
以下几点可以帮助您快速了解ASP.NET。
- ASP.NET提供服务,允许创建、部署和执行Web应用程序和Web服务。
- 与ASP一样,ASP.NET也是一种服务器端技术。
- Web应用程序使用Web Forms构建。ASP.NET带有内置的Web Forms控件,负责生成用户界面。它们模仿了文本框或按钮等典型的HTML控件。如果这些控件不能满足您的需求,您可以自由创建自己的用户控件。
- Web Forms的设计目的是使构建基于Web的应用程序像构建Visual Basic应用程序一样简单。
ASP.NET架构
ASP.NET基于.NET Framework的基本架构。Visual Studio提供了一种统一的方式来组合此架构的各种功能。
在以下讨论中,架构将从下往上进行解释。
-
架构的最底层是公共语言运行时(Common Language Runtime)。.NET Framework公共语言运行时位于操作系统服务之上。公共语言运行时加载并执行针对运行时的代码。因此,此代码称为托管代码。运行时为您提供了例如跨语言集成的能力。
-
.NET Framework提供了一组丰富的类库。这些包括基类,如网络和输入/输出类,用于数据访问的数据类库,以及供编程工具(如调试服务)使用的类。所有这些都由位于公共语言运行时之上的服务框架(Services Framework)整合在一起。
-
ADO.NET是Microsoft的ActiveX Data Object (ADO) 模型在.NET Framework中的应用。ADO.NET不仅仅是将流行的ADO模型迁移到托管环境,而是一种全新的数据访问和操作范例。
ADO.NET专门为开发Web应用程序而设计。这可以从其两个主要设计原则中看出:- 断开连接的数据集—在ADO.NET中,几乎所有的数据操作都在开放数据库连接的上下文之外完成。
- 轻松与XML进行数据交换—数据集可以使用Web的通用数据格式XML进行通信。
-
框架的第四层由Windows应用程序模型和并行存在的Web应用程序模型组成。
Web应用程序模型—在幻灯片中显示为ASP.NET—包括Web Forms和Web Services。
ASP.NET带有内置的Web Forms控件,负责生成用户界面。它们模仿了文本框或按钮等典型的HTML控件。如果这些控件不能满足您的需求,您可以自由创建自己的用户控件。
Web Services提供了一种模型,用于通过Internet将不同的应用程序绑定在一起。此模型基于现有基础设施和应用程序,因此是标准化的、简单的且可适应的。
Web Services是通过Internet交付给任何设备的软件解决方案。如今,这主要意味着计算机上的Web浏览器,但.NET的设备无关设计将消除这一限制。 - .NET的一个明显主题是各种编程语言之间的统一和互操作性。为了实现这一点,必须制定一定的规则,所有语言都必须遵循这些规则。换句话说,我们不能让语言随意创建自己的扩展和自己的花哨新数据类型。CLS是每种(寻求.NET兼容性的)语言都必须遵循的规则和约束的集合。
- 然而,CLR和.NET Framework总体设计方式使得用一种语言编写的代码不仅可以被另一种语言无缝使用。因此,ASP.NET可以使用任何.NET兼容的语言进行编程,无论是VB.NET、C#、Managed C++还是JScript.NET。
快速入门:ASP.NET
在对.NET Framework进行了一些背景知识的简要介绍后,我们将重点关注ASP.NET。
文件名扩展
使用ASP.NET编写的Web应用程序将包含许多具有不同文件名扩展名的文件。最常见的列在这里。默认情况下,原生ASP.NET文件扩展名为.aspx(当然,这是对.asp的扩展)或.ascx。Web Services通常具有.asmx扩展名。
包含业务逻辑的文件名将取决于您使用的语言。例如,C#文件将具有.aspx.cs扩展名。您已经了解了配置文件Web.Config。
另一个值得一提的是ASP.NET应用程序文件Global.asax —在ASP时代,以前称为Global.asa。但现在还有一个代码隐藏文件Global.asax.vb,例如,如果该文件包含Visual Basic.NET代码。Global.asax是一个可选文件,位于应用程序的根目录下,它包含应用程序的全局逻辑。
所有这些都是文本文件
所有这些文件都是文本文件,因此是人类可读写的文件。
最简单的入门方法
开始使用ASP.NET最简单的方法是采用一个简单的ASP页面,然后将文件名扩展更改为.aspx。
页面语法
这里是ASP.NET使用的语法的快速介绍。
指令
您可以使用指令来指定页面编译器在处理ASP.NET文件时使用的可选设置。对于每个指令,您可以设置不同的属性。一个例子是在页面开头定义默认编程语言的language指令。
代码声明块
代码声明块是用<script>标签括起来的代码行。它们包含runat=server属性,该属性告诉ASP.NET这些控件可以在服务器和客户端上访问。您还可以选择指定块的语言。代码块本身由成员变量和方法的定义组成。
代码渲染块
渲染块包含在这里所示的字符序列括起来的内联代码或内联表达式。这些块内的语言可以通过像前面所示的指令来指定。
HTML服务器控件语法
您可以将一些标准的HTML元素声明为HTML服务器控件。使用您熟悉的HTML元素,并添加runat=server属性。这会导致HTML元素被视为服务器控件。它现在可以通过唯一的ID以编程方式访问。HTML服务器控件必须位于一个也具有runat=server属性的<form>部分内。
自定义控件语法
有两种不同类型的自定义控件。一方面是.NET自带的控件,另一方面您可以创建自己的自定义控件。使用自定义服务器控件是封装通用编程功能的最佳方法。
只需像HTML元素一样指定元素,但添加一个标签前缀,它是控件完全限定命名空间的别名。同样,您必须包含runat=server属性。如果您想以编程方式访问控件,只需添加一个Id属性。
您可以为每个服务器控件设置属性来表征其行为。例如,您可以设置TextBox的最大长度。这些属性可能有子属性;您从HTML中知道这个原理。现在您能够指定例如您使用的字体的尺寸和类型(font-size和font-type)。
最后一个属性专用于事件绑定。这可以用来将控件绑定到特定事件。如果您实现了自己的方法MyClick
,当使用幻灯片中显示的服务器控件事件绑定时,该方法将在相应的按钮被点击时执行。
数据绑定表达式
您可以在服务器控件和数据源之间创建绑定。数据绑定表达式包含在字符序列<%#和%>中。ASP.NET提供的数据绑定模型是分层的。这意味着您可以在服务器控件属性和上级数据源之间创建绑定。
服务器端对象标签
如果您需要在服务器上创建对象的实例,请使用服务器端对象标签。当页面被编译时,将创建一个指定对象的实例。使用identifier属性来指定对象。您可以使用class作为标识符声明(并实例化).NET对象,使用progid或classid声明(并实例化)COM对象。
服务器端包含指令
使用服务器端包含指令,您可以将文件的原始内容包含在ASP.NET文件的任何位置。使用pathtype属性指定文件名的路径类型。使用File指定相对路径,或使用Virtual指定完整的虚拟路径。
服务器端注释
要阻止服务器代码执行,请使用这些字符序列将其注释掉。您可以注释掉整个块,而不仅仅是单行。
第一个ASP.NET程序。
现在让我们编写第一个ASP.NET程序。
让我们看看一个简单的Web Forms应用程序的标记部分和C#部分,该应用程序通过软件动态生成电影阵容。
标记部分
Web Forms应用程序第一部分 -- SimpleWebForm.aspx
<% @Page Language="C#" Inherits="MoviePage" Src="SimpleWebForm.cs" %>
<html>
<body background="Texture.bmp">
<TITLE>Supermegacineplexadrome!</TITLE>
<H1 align="center"><FONT color="white" size="7">Welcome to
Supermegacineplexadrome!</FONT></H1>
<P align="left"><FONT color="lime" size="5"><STRONG>
<U>Showtimes for <%WriteDate();%></U>
</STRONG></FONT></P>
<FONT size="5" color="yellow"><%WriteMovies();%></FONT>
</body>
</html>
而这正是Web Forms应用程序的C#部分发挥作用的地方。
Web Forms应用程序第二部分 - SimpleWebForm.cs
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
public class MoviePage:Page
{
protected void WriteDate()
{
Response.Write(DateTime.Now.ToString());
}
protected void WriteMovies()
{
Response.Write("<P>The Glass Ghost (R) 1:05 pm, 3:25 pm, 7:00 pm</P>");
Response.Write("<P>Untamed Harmony (PG-13) 12:50 pm, 3:25 pm, " +
"6:55 pm</P>");
Response.Write("<P>Forever Nowhere (PG) 3:30 pm, 8:35 pm</P>");
Response.Write("<P>Without Justice (R) 12:45 pm, 6:45 pm</P>");
}
}
执行周期
现在让我们看看服务器端发生了什么。您很快就会理解服务器控件是如何融入其中的。
对.aspx文件的请求会导致ASP.NET运行时解析该文件以获取可编译的代码。然后,它生成一个页面类,该类实例化并填充服务器控件实例的树。此页面类代表ASP.NET页面。
现在启动一个执行序列,其中,例如,ASP.NET页面遍历其所有控件列表,要求每个控件渲染自己。
控件将自身绘制到页面上。这意味着它们通过生成HTML输出来使自己在浏览器客户端可见。
执行过程
我们需要看看您的代码在ASP.NET中是如何处理的。
首次请求页面时的编译
首次请求页面时,代码会被编译。在.NET中编译代码意味着编译器首先发出Microsoft中间语言(MSIL)并生成元数据—如果您将源代码编译为托管代码。在后续步骤中,MSIL必须转换为本机代码。
Microsoft中间语言(MSIL)
Microsoft中间语言是一种汇编语言风格的代码。它是CPU无关的,因此可以有效地转换为本机代码。
转换本身可以是CPU特定的并经过优化的。中间语言提供了一个硬件抽象层。
MSIL由公共语言运行时执行。
公共语言运行时
公共语言运行时包含即时(JIT)编译器,用于将MSIL转换为本机代码。这在代码应该运行的同一计算机体系结构上完成。
运行时在代码被编译成MSIL时对其进行管理—因此该代码被称为托管代码。
ASP.NET应用程序和配置
概述
与ASP一样,ASP.NET将其实体封装在Web应用程序中。Web应用程序是对IIS虚拟目录范围内所有可用资源的抽象术语。例如,Web应用程序可能包含一个或多个ASP.NET页面、程序集、Web服务配置文件、图形等。在本节中,我们将探讨Web应用程序的两个基本组件,即全局应用程序文件(Global.asax)和配置文件(Web.config)。
Global.asax
Global.asax是用于声明应用程序级别事件和对象的*.asp文件。Global.asax是ASP Global.asa文件的ASP.NET扩展。处理应用程序事件(如应用程序的启动和结束)的代码位于Global.asax中。此类事件代码不能存在于ASP.NET页面或Web服务代码本身,因为在应用程序启动或结束时,其代码尚未加载(或已卸载)。Global.asax还用于声明可在不同应用程序请求或不同浏览器会话之间共享的数据。此过程称为应用程序和会话状态管理。
Global.asax文件必须位于IIS虚拟根目录下。请记住,虚拟根目录可以被视为Web应用程序的容器。在全局文件中指定的事件和状态然后应用于托管在Web应用程序内的所有资源。例如,如果Global.asax定义了一个应用程序状态变量,则虚拟根目录下的所有.aspx文件都可以访问该变量。
与ASP.NET页面一样,Global.asax文件在应用程序中任何资源的第一次请求到达时进行编译。当对Global.asax文件进行更改时,相似性仍在继续;ASP.NET会自动检测到更改,重新编译该文件,并将所有新请求定向到最新的编译版本。在VS.NET IDE中创建新的Web应用程序项目时,会自动创建一个Global.asax文件。
应用程序指令
应用程序指令放在Global.asax文件的顶部,并提供用于编译全局文件的信息。定义了三个应用程序指令,即Application、Assembly和Import。每个指令都使用以下语法应用。
<%@ appDirective appAttribute=Value ...%>
Web.config
在ASP中,应用程序的配置设置(如会话状态)存储在IIS元数据库中。此方案有两个主要缺点。首先,设置不是以人类可读的方式存储,而是以专有的二进制格式存储。其次,设置不容易从一台主机迁移到另一台主机。(即使另一台机器具有相同版本的Windows,也很难将信息从IIS的元数据库或Windows注册表传输到另一台机器。)
Web.config通过将配置信息存储为XML来解决上述两个问题。与注册表或元数据库条目不同,XML文档是人类可读的,并且可以使用任何文本编辑器进行修改。其次,XML文件更易于移植,只需简单地进行文件传输即可在机器之间切换。
与Global.asax不同,Web.config可以驻留在任何目录中,该目录可以是虚拟根目录,也可以不是。然后,Web.config设置将应用于该目录内及其子目录中访问的所有资源。一个后果是,一个IIS实例可能包含许多Web.config文件。属性以分层方式应用。换句话说,使用最低级别目录中的Web.config文件。
由于Web.config基于XML,因此它对于各种应用程序来说是可扩展且灵活的。但是,重要的是要注意Web.config文件是可选的。所有ASP.NET应用程序资源使用的默认Web.config文件可以在本地计算机上找到,路径为
\%winroot%\Microsoft.Net\Framework\version\CONFIG\machine.config
摘要
ASP.NET是Microsoft Active Server Page(ASP)技术的演进。使用ASP.NET,您可以基于.NET框架快速开发高度先进的Web应用程序。Visual Studio Web Form Designer允许以直观的图形化方式设计Web应用程序,类似于Visual Basic 6。ASP.NET带有包装每个标准HTML控件的Web控件,此外还有一些.NET特有的控件。例如,验证控件可以直观地验证用户输入,而无需大量的客户端脚本。
在许多方面,ASP.NET比ASP有了重大改进,并且绝对可以被认为是快速开发基于Web的应用程序的可行替代方案。
关注点
我写这篇教程是为了与您分享我的ASP.NET知识。您可以在我的网站http://programmerworld.net 上找到更多免费源代码的文章和软件项目。
历史
- 发布日期:2003年6月27日