ASP.NET 是建立在公共语言运行库上的编程框架,可用于在服务器上生成功能强大的 Web 应用程序。与以前的 Web 开发模型相比,ASP.NET 提供了数个重要的优点:
• 增强的性能。ASP.NET 是在服务器上运行的编译好的公共语言运行库代码。与被解
释的前辈不同,ASP.NET 可利用早期绑定、实时编译、本机优化和盒外缓存服务。这相当于在编写代码行之前便显著提高了性能。
• 世界级的工具支持。ASP.NET Framework 补充了 Visual Studio 集成开发环境中
的大量工具箱和设计器。WYSIWYG 编辑、拖放服务器控件和自动部署只是这个强大的工具所提供功能中的少数几种。
• 威力和灵活性。由于 ASP.NET 基于公共语言运行库,因此 Web 应用程序开发人员
可以利用整个平台的威力和灵活性。.NET Framework 类库、消息处理和数据访问解决方案都可从 Web 无缝访问。ASP.NET 也与语言无关,所以可以选择最适合应用程序的语言,或跨多种语言分割应用程序。另外,公共语言运行库的交互性保证在迁移到 ASP.NET 时保留基于 COM 的开发中的现有投资。
• 简易性。ASP.NET 使执行常见任务变得容易,从简单的窗体提交和客户端身份验证
到部署和站点配置。例如,ASP.NET 页框架使您可以生成将应用程序逻辑与表示代码清楚分开的用户界面,和在类似 Visual Basic 的简单窗体处理模型中处理事件。另外,公共语言运行库利用托管代码服务(如自动引用计数和垃圾回收)简化了开发。
• 可管理性。ASP.NET 采用基于文本的分层配置系统,简化了将设置应用于服务器环
境和 Web 应用程序。由于配置信息是以纯文本形式存储的,因此可以在没有本地管理工具帮助的情况下应用新设置。此“零本地管理”哲学也扩展到了 ASP.NET Framework 应用程序的部署。只需将必要的文件复制到服务器,即可将 ASP.NET Framework 应用程序部署到服务器。不需要重新启动服务器,即使是在部署或替换运行的编译代码时。
• 可缩放性和可用性。ASP.NET 在设计时考虑了可缩放性,增加了专门用于在聚集环
境和多处理器环境中提高性能的功能。另外,进程受到 ASP.NET 运行库的密切监视和管理,以便当进程行为不正常(泄漏、死锁)时,可就地创建新进程,以帮助保持应用程序始终可用于处理请求。
• 自定义性和扩展性。ASP.NET 随附了一个设计周到的结构,它使开发人员可以在适
当的级别“插入”代码。实际上,可以用自己编写的自定义组件扩展或替换 ASP.NET 运行库的任何子组件。实现自定义身份验证或状态服务一直没有变得更容易。 • 安全性。借助内置的 Windows 身份验证和基于每个应用程序的配置,可以保证应用
程序是安全的。
二、语言支持
Microsoft .NET 平台目前提供对以下三种语言的内置支持:C#、Visual Basic 和 JScript。 本教程中的练习和代码示例展示如何使用 C#、Visual Basic 和 JScript 生成 .NET 应用程序。有关其他语言语法的信息,请参考 .NET Framework SDK 的完整文档。 提供下表以帮助您理解本教程中的代码示例以及三种语言之间的差异: 变量声明
Dim x As Integer Dim s As String Dim s1, s2 As String Dim o 'Implicitly Object Dim obj As New Object() Public name As String 语句
Response.Write(\"foo\") 注释
' This is a comment ' This ' is ' a ' multiline ' comment
访问索引属性
Dim s, value As String s = Request.QueryString(\"Name\") value = Request.Cookies(\"Key\").Value 'Note that default non-indexed properties 'must be explicitly named in VB 声明索引属性
' Default Indexed Property Public Default ReadOnly Property DefaultProperty(Name As String) As String Get Return CStr(lookuptable(Name)) End Get End Property
声明简单属性
Public Property Name As String Get ... Return ... End Get Set ... = Value End Set End Property 声明和使用枚举
' Declare the Enumeration Public Enum MessageSize Small = 0 Medium = 1 Large = 2 End Enum ' Create a Field or Property Public MsgSize As MessageSize ' Assign to the property using the Enumeration values MsgSize = small
枚举集合
Dim S As String For Each S In Coll ... Next 声明和使用方法
' Declare a void return function Sub VoidFunction() ... End Sub ' Declare a function that returns a value Function StringFunction() As String ... Return CStr(val) End Function ' Declare a function that takes and returns values Function ParmFunction(a As String, b As String) As String ... Return CStr(A & B) End Function ' Use the Functions VoidFunction() Dim s1 As String = StringFunction() Dim s2 As String = ParmFunction(\"Hello\ 自定义属性
' Stand-alone attribute Dim s As String = \"Hello World\" Dim i As Integer = 1 Dim a() As Double = { 3.00, 4.00, 5.00 } If 语句 If Not (Request.QueryString = Nothing) ... End If Case 语句 Select Case FirstName Case \"John\" ... Case \"Paul\" ... Case \"Ringo\" ... Case Else ... End Select For 循环 Dim I As Integer For I = 0 To 2 a(I) = \"test\" Next While 循环 Dim I As Integer I = 0 Do While I < 3 Console.WriteLine(I.ToString()) I += 1 Loop 异常处理 Try ' Code that throws exceptions Catch E As OverflowException ' Catch a specific exception Catch E As Exception ' Catch the generic exceptions Finally ' Execute some cleanup code End Try 字符串连接 ' Using Strings Dim s1, s2 As String s2 = \"hello\" s2 &= \" world\" s1 = s2 & \" \" ' Using StringBuilder class for performance Dim s3 As New StringBuilder() s3.Append(\"hello\") s3.Append(\" world\") s3.Append(\" \") 事件处理程序委托 Sub MyButton_Click(Sender As Object, E As EventArgs) ... End Sub 声明事件 ' Create a public event Public Event MyEvent(Sender as Object, E as EventArgs) ' Create a method for firing the event Protected Sub OnMyEvent(E As EventArgs) RaiseEvent MyEvent(Me, E) End Sub 向事件添加事件处理程序或从事件移除事件处理程序 AddHandler Control.Change, AddressOf Me.ChangeEventHandler RemoveHandler Control.Change, AddressOf Me.ChangeEventHandler 强制类型转换 Dim obj As MyObject Dim iObj As IMyObject obj = Session(\"Some Value\") iObj = CType(obj, IMyObject) 转换 Dim i As Integer Dim s As String Dim d As Double i = 3 s = i.ToString() d = CDbl(s) ' See also CDbl(...), CStr(...), ... 带继承的类定义 Imports System Namespace MySpace Public Class Foo : Inherits Bar Dim x As Integer Public Sub New() MyBase.New() x = 4 End Sub Public Sub Add(x As Integer) Me.x = Me.x + x End Sub Overrides Public Function GetNum() As Integer Return x End Function End Class End Namespace ' vbc /out:libraryvb.dll /t:library ' library.vb 实现接口 Public Class MyClass : Implements IEnumerable ... Function IEnumerable_GetEnumerator() As IEnumerator _ Implements IEnumerable.GetEnumerator ... End Function End Class 带 Main 方法的类定义 Imports System Public Class ConsoleVB Public Sub New() MyBase.New() Console.WriteLine(\"Object Created\") End Sub Public Shared Sub Main() Console.WriteLine(\"Hello World\") Dim cvb As New ConsoleVB End Sub End Class ' vbc /out:consolevb.exe /t:exe console.vb 标准模块 Imports System Public Module ConsoleVB Public Sub Main() Console.WriteLine(\"Hello World\") End Sub End Module ' vbc /out:consolevb.exe /t:exe console.vb 三、应用程序概述 什么是 ASP.NET 应用程序? 创建应用程序 应用程序的生存期 关于多线程的说明 什么是 ASP.NET 应用程序? ASP.NET 将应用程序定义为所有文件、页、处理程序、模块和可执行代码的总和,这些文件、页、处理程序、模块和可执行代码必须可在 Web 应用程序服务器上的给定虚拟目录(及其子目录)的范围内调用或运行。例如,可在 Web 服务器计算机上的“/order”虚拟目录中发布一个“order”应用程序。对于 IIS,可在 Internet 服务管理器中设置虚拟目录;该目录包含所有子目录,除非子目录本身就是虚拟目录。 Web 服务器上的每个 ASP.NET Framework 应用程序都在唯一的 .NET Framework 应用程序域中执行,从而保证了类隔离(无版本或命名冲突)、安全沙箱(防止访问特定计算机或网络资源)和静态变量隔离。 ASP.NET 在 Web 应用程序的生存期内维护 HttpApplication 实例池。ASP.NET 自动指派其中的某个实例处理应用程序接收到的每个传入 HTTP 请求。所指派的特定 HttpApplication 实例负责管理请求的整个生存期,并仅在请求完成后才被重新使用。这意味着 HttpApplication 中的用户代码不必是可重入的。 创建应用程序 若要创建 ASP.NET Framework 应用程序,可以使用现有虚拟目录或创建新的虚拟目录。例如,如果安装了包含 IIS 的 Windows 2000 Server,则可能有一个 C:\\InetPub\\WWWRoot 目录。可以使用 Internet 服务管理器(位于“开始”->“程序”->“管理工具”下)来配置 IIS。右击一个现有目录并选择“新建”(创建新的虚拟目录)或“属性”(提升现有的常规目录)。 通过在虚拟目录中放置一个类似于下面这样的简单 .aspx 页并通过浏览器来访问它,即可开始创建 ASP.NET 应用程序。 <%@Page Language=\"VB\"%> ASP.NET Framework 应用程序在第一次向服务器发出请求时创建,在此之前,不执行 ASP.NET 代码。当第一个请求发出后,将创建一个 HttpApplication 实例池并引发 Application_Start 事件。HttpApplication 实例处理该请求以及后面的请求,直到最后一个实例退出并引发 Application_End 事件。 请注意,HttpApplication 的 Init 和 Dispose 方法在每个实例中都被调用,因此可在 Application_Start 和 Application_End 之间被调用多次。在一个 ASP.NET 应用程序中,只有这些事件在 HttpApplication 的所有实例中共享。 关于多线程的说明 如果与应用程序范围一起使用对象,应注意 ASP.NET 并发处理请求,且 Application 对象可被多个线程访问。因此,如果页被不同的客户端同时重复请求,则以下代码将是危险的,可能不会产生预期的结果。 <% Application(\"counter\") = CType(Application(\"counter\"), Int32) + 1 %> 若要使此代码线程是安全的,请使用 Lock 和 UnLock 方法序列化对 Application 对象的访问。但是,这样做也意味着接受相当大的性能影响: <% Application.Lock() Application(\"counter\") = CType(Application(\"counter\"), Int32) + 1 Application.UnLock() %> 另一个解决方案是使同应用程序范围一起存储的对象成为线程安全的。例如,注意由于性能原因,System.Collections 命名空间中的集合类不是线程安全的。 因篇幅问题不能全部显示,请点此查看更多更全内容hello world, <% Response.Write(DateTime.Now.ToString()) %>
现在可以添加适当的代码以使用 Application 对象,例如与应用程序范围一起存储对象。通过创建 global.asax 文件,还可以定义各种事件处理程序,例如为 Application_Start 事件。 应用程序的生存期