SqlConnection("server=(local)NetSDK;
database=mydb;Trusted_Connection
=yes")
Dim myCommand As New
SqlDataAdapter("select * from
mytable", myConnection)
Dim ds As New DataSet()
myCommand.Fill(ds, "myDataset")
myDataGrid.DataSource = myDataset
myDataGrid.DataBind()
End Sub
</script>
<%--- 输出结果 ---%>
<form runat="server">
<asp:DataGrid id="myDataGrid"
runat="server" />
</form>
在 PHP 中,查询结果存储在一个称为 result set(结果集)的变量中,而在 ADO.NET 中,该变量称为 Dataset 对象。结果集是返回数据的只读视图,而 .NET Dataset 实际上是返回数据在内存中的读写视图,这使 .NET 开发人员能够轻松地处理从数据源返回的数据。
输出数据时,ASP.NET 提供了若干方法,用于向用户或客户端显示数据。第一种方法与 PHP 类似,即使用 SQLDataReader 对象遍历结果集以写出我们要通过查询显示的数据。更常用的方法是 ASP.NET 的数据绑定(PHP 中没有与此对应的方法)。通过该方法,开发人员可以构建用户界面并显示可在应用程序中使用和重用的控件,还可以进一步根据数据和逻辑提取显示内容。数据绑定的语法很灵活,您不仅可以绑定到数据源,还可以绑定到简单的属性、集合、表达式,甚至是方法调用返回的结果。
要使用数据绑定,您需要向某个数据识别服务器控件(例如 DataGrid
)的 DataSource
属性指定某个数据源(例如查询结果)。您还可以选择为每个列提供一些附加的格式化信息并调用 DataBind()
方法。服务器控件将负责完成剩余的工作。
例如,在表 13 中,我们使用了数据绑定语法输出查询结果,如下所示:
<%--- 在页面中加载事件---%>myDataGrid.DataSource = myDatasetmyDataGrid.DataBind()<%--- 输出结果 ---%><asp:DataGrid id="myDataGrid" runat="server" />
数据识别服务器控件将提供其他功能,例如支持对显示的数据进行分页或内联编辑。有关详细信息和示例,请参阅 Data Binding Server Controls。
数据缓存和页面缓存
对经常访问的数据进行缓存可以显著缩短站点的响应时间,因为不需要等待数据库查询便可进行页面处理。而缓存由页面请求生成的 HTML 可以进一步缩短响应时间,因为根本就无需处理缓存的页面。这两种环境均支持上述两种缓存策略,但与 PHP 相比,ASP.NET 提供了更多用于缓存和管理数据的方法,从而使开发人员可以针对自己应用程序的性能需要选择相应的方法和策略。
页面缓存
缓存某个页面请求的 HTML 输出是减少 Web 应用程序的负载的一种常用方法。PHP 本身不支持页面缓存,但是可以通过编程的方式或下载第三方软件包来执行此操作。通常可以在服务器上通过多种方法执行页面缓存,这些方法可用于缓存编译的代码,直至将页面输出写出到一个单独的文件中(该文件将随代码的更新而更新)。
在 ASP.NET 中,可以通过低级别的 OutputCache
API 或高级别的 @ OutputCache
指令来执行页面缓存。启用输出缓存后,将在对页面进行第一个 GET
请求时创建输出缓存条目。后续的 GET
或 HEAD
请求将由输出缓存条目支持,直到缓存的请求过期。
输出缓存将检查页面的过期策略和验证策略。如果页面位于输出缓存中并标记了过期策略(指示该页面自缓存时开始 60 分钟后过期),则 60 分钟后,该页面将从输出缓存中删除。如果在过期后收到另一个请求,将执行页面代码并再次缓存该页面。这种过期策略称为绝对过期,即页面在某个时间之前有效。
除了对整个页面进行输出缓存外,ASP.NET 还提供了一个简单方法,使您可以只缓存页面的特定部分。这种方法称为拆分缓存。您可以使用用户控件 (User Control) 来指定页面区域,并使用前面介绍的 @ OutputCache
指令将这些区域标记为缓存区域。该指令指定了用户控件的输出内容在服务器上缓存的时间(以秒为单位)以及影响这一时间的任何可选条件。
有关 ASP.NET 的输出缓存的详细信息,请参阅 Caching ASP.NET Pages。
数据缓存
在 PHP 中,可以通过多种方法以编程方式将查询结果缓存到环境中,但 PHP 本身并未提供这种方法。在 PHP 中,可以创建数据缓存类或系统。对于少量信息,只需使用 Session 变量和/或 Cookie;对于大量或复杂的信息,可以创建您自己的数据缓存类。但问题是,当处理包含很多类型的复杂数据时,这种方法的效率会很低且容易出错,在一定程度上会加大编程的难度。
ASP.NET 通过 Page.Cache
对象提供了一个系统范围的数据缓存方法,可用于数据集 (DataSet)、数组、集合、XML 对象等。对于需要更复杂功能的应用程序,ASP.NET 缓存还支持三种特定类型的缓存:过期、清理以及文件和关键项相关性。
- 过期类型的缓存使开发人员可以控制缓存项目的过期时间。可以将该时间定义为特定的时间(例如 01:00),也可以将其定义为相对于上次使用项目时的时间,例如自上次访问该项目时开始 20 分钟后过期。过期后的项目将从缓存中删除,以后再试图检索该项目时,将返回空值(除非再次将其插入到缓存中)。
- 清理类型的缓存会在内存不足时尝试删除不经常使用或不重要的项目。开发人员可以控制清理的执行方式,并且可以在将项目插入到缓存中时向清理程序提供提示,以指示创建该项目的相对系统开销以及为使该项目有效而必须对其进行访问的相对频率。
- 文件和关键项相关性类型的缓存将基于某个外部文件或另一个缓存项目确定该缓存项目的有效性。如果相关项发生变化,缓存项目将失效并从缓存中删除。例如,假设您有一个较大的需要定期更新并下载给员工的报告,则可以在应用程序中使用此功能。应用程序处理文件和报告中的数据,然后缓存该数据并插入对该数据的来源文件(从该文件读取数据)的相关性。当该文件更新时,数据将从缓存中删除,应用程序可以重新读取它并重新插入更新的数据副本。
ASP.NET 数据缓存为编程人员提供了许多不同的方法来管理应用程序并提高应用程序的响应速度和效率。有关详细信息,请参阅 Cache Class 文档以了解 Cache
对象。
发送电子邮件
PHP 和 ASP.NET 都为以编程方式发送电子邮件提供了内置的支持。要在此示例中使用 ASP.NET 发送电子邮件,您需要设置 IIS SMTP 服务。因为 .NET 中的内置邮件对象依赖于该服务包含的对象,所以您必须安装它。尽管如此,与 PHP 一样,.NET 也允许您使用任何 SMTP 服务器或邮件服务器。表 14 对这两种环境的基本语法进行了比较。
表 14:发送电子邮件
$to = "test@atnoaddress.com";
$from =
"me@nosuchaddress.com";
$subject = "hi";
$message = "just wanted to say
hi";
mail($to,$subject,$message,
$from)
Dim myMail As MailMessage = New
MailMessage()
myMail.From = "me@nosuchaddress.com"
myMail.To = "test@atnoaddress.com"
myMail.Subect = "hi"
myMail.Body = "just wanted to say hi"
SmtpMail.Send(myMail)
XML 处理和 Web 服务
在 PHP 中,为分析和处理 XML 所提供的内置支持功能非常薄弱。虽然开发人员可以用它来分析和处理 XML,但它不支持 DOM 分析(该分析尽管比 PHP 的 SAX 分析器速度慢,但更容易使用)。PHP 也不支持根据 DTD 或 XML SCHEME 对 XML 文档进行本地验证,它也不支持 XSL/XSLT 以及市场上许多 Web 应用程序常用的各种其他技术。虽然 PHP 可以通过很多 PHP 软件包完成许多与 XML 相关的任务,但 .NET 和 ASP.NET 为处理 XML 提供了广泛的内置支持。XML 是 .Net 平台的核心技术之一。有关 Web 服务的详细信息,请参阅 How ASP.NET Web Services Work。
.NET Framework 为 W3C 定义的所有 XML 建议提供了广泛的支持,此外还支持 XSL/XSLT、XPath、XQuery 以及各种其他技术,例如用于 Web 服务的 UDDI、WSDL 以及 SOAP。
虽然可以在 PHP 中创建 XML-RPC 类型的机制,但创建 Web 服务(使开发人员能够使用常用协议和标准来交换数据和过程并将其用于查找、数据绑定和描述)。.NET 为 Web 服务和相关技术(如 SOAP、WSDL 和 UDDI)提供了广泛的支持。使用 .NET,开发人员还可以轻松地创建和开发 Web 服务。例如,以下代码将创建一个简单的 hello world Web 服务:
<%@ WebService Language="VB" Class="HelloWorld" %>Imports SystemImports System.Web.ServicesPublic Class HelloWorld :Inherits WebService <WebMethod()> Public Function SayHelloWorld() As String Return("Hello World") End FunctionEnd Class
利用 .NET Framework SDK,您可以使用命令行 Web 服务描述语言工具 (WSDL.exe
) 生成代理类。要为上述示例创建一个名为 HelloWorld.cs
的代理类,可以输入:
WSDL http://someDomain.com/someFolder/HelloWorld.asmx?WSDL
此类与前面创建的类非常相似。它包含一个名为 SayHelloWorld
的方法,用于返回字符串。将此代理类编译到应用程序中,然后调用此代理类的方法,使该代理类通过 HTTP 将 SOAP 请求打包并接收 SOAP 编码的响应,该响应随后被封装为字符串。
对于客户端,该代码是非常简单的,如以下示例所示:
Dim myHelloWorld As New HelloWorld()Dim sReturn As String = myHelloWorld.SayHelloWorld()
这就是创建一个简单 Web 服务的全过程。有关 XML 的一般信息以及 Web 服务的特定信息,请参阅 Employing XML in the .NET Framework。
小结
对于简单的小型应用程序,从 PHP 迁移到 ASP.NET 通常并不复杂。对于更复杂的应用程序,由于基础体系结构的不同以及 ASP.NET 的 OOP 模式,需要进行事先规划和精心设计,以利用 ASP.NET 提供的将显示与逻辑和数据明确分开的功能,以及可以节省时间的内置功能。与 PHP 相比,这些功能可以显著减少完成相同任务所需的代码数量。