自己翻译的书(关于ASP.NET),希望对大家有帮助 (二)

动态网页介绍
我刚才介绍的客户端-服务器端-客户端的处理过程是非常重要的,因为它发生在在每次客户端联系服务器端来获取数据的过程中。这完全不同于你已经熟悉的单机模型或者是客户端-服务器端模型。因为客户端和服务器端不知道对方,所以对于每次交互,你必须发送,初始化或者存储适当的值来维持应用的可持续性。
让我们来看一个简单的例子。假设你有一个带有登录表单(Form)的安全站点。在一个标准的程序中,在用户成功登录之后,那就是唯一的你需要做的验证了。事实就是用户成功的登录意味着他已经被授权了使用应用程序的周期。相反的,当你登录了一个只有登陆框和密码框的网站时,服务器必须对你接下来的每一个请求进行重新验证。这可能就是一个很简单的工作,但是它必须对应用中的每个请求都加以实施。
事实上,那就是动态页面应用变得流行的原因。在一个允许匿名连接的网站上(就像大部分的网站那样),你能够授权给用户权限只有当你能够比较存储在服务器上用户名/密码的“真正的”备份。但是大部分情况下,HTML是一个适当的布局型语言,而不是编程语言。它需要其他代码的帮助才能授权用户。
另一个动态网页变得流行的原因就是信息属性的改变。静态页面对于文章,论文,图书和图像的支持非常好——总的来说,就是对于很少变化的信息支持很好。但是静态页面对于雇员和联系人列表,日历信息,新闻递送,体育比赛比分——总的来说,就是那些你需要每时每刻交互的数据的支持——不太好。数据改变太多以至于无法成功的在静态页面中被维护。另外,你不会想要总是以同样的方式看到相同的数据。我觉得我在这里有点废话——如果你不知道动态页面有这些优势,你根本不会买这本书。但是,如果可以注意到即使是动态页面也是会有一个可以预测的变化几率的,这是很有用的——我会在备注中讨论它。
服务器如何从内容中分离代码
在经典的ASP页面中,你可以通过放置一个特别的标签(<%%>)在代码前后或者是通过撰写脚本块来混合代码和内容。脚本是被包含在<script> 和</script>标签之中。经典的ASP使用.asp作为文件扩展名。当服务器接到一个来自ASP文件的请求,它会通过文件的扩展名认出这是一个ASP文件,所以这个请求需要ASP的处理器来回应这个请求。因此,服务器会传递这个请求给ASP引擎,这个引擎可以解析文件来把代码从标记中分离出来。ASP引擎开始处理代码,并且把结果和页面中的HTML混合,之后发送混合好的结果到客户端。ASP.NET使用一个类似的处理流程,但是文件的扩展名是.aspx而不是.asp。你仍然可以以完全相同的方法混合代码和内容,只是在ASP.NET中,你可以(并且应该)把代码放到一个分离的文件中,叫做后台代码类(code-behind class),因为这样做会提供一种更加干净的显示代码和应用代码的区分并且使得两者可以更加容易的被重用。在ASP.NET中,你可以把代码写在三个地方的任何一个——后台代码类,代码标签和脚本块。但是,ASP.NET引擎仍然需要为HTML文件解析代码标签。
服务器何时并且怎么样处理代码  
ASP.NET引擎本身是一个互联网应用程序接口(ISAPI)应用。ISAPI应用程序是一些DLL,这些DLL会被加载进服务器的地址空间,所以他们非常快。不同的ISAPI应用程序会处理不同类型的请求。你可以为特别的文件扩展创建ISAPI应用,例如.asp或者.aspx,或者是为标准的文件类型,例如HTML和XML,进行特别的操作。
有两种ISAPI应用:扩展(Extension)和过滤器(Filter)。ASP.NET引擎本身就是一个ISAPI扩展。一个ISAPI扩展应用替代或者增强了标准的IIS响应。扩展应用在服务器收到一个关联与ISAPI扩展应用的DLL请求时被加载。相反的,ISAPI过滤器先被IIS加载并且通知服务器哪些过滤器事务(Event)可以 被处理。一旦某种类型的过滤器事务发生,IIS发出一个事务通知给相应的过滤器。
注意:你不能使用C#创建ISAPI应用程序——或者说是用托管代码(Managed Code)——尽管你能在VS.NET中使用非托管的C++代码或者是活动模板类(ATL)来创建它们。然而你可以使用C#重写(Override)默认的HttpApplication来提供更过种ISAPI应用。
ASP.NET页面如果包含代码标签或者是包含后台代码类,它就会越过标准的IIS响应程序。如果你的aspx页面不包含任何代码,ASP.NET引擎在完成页面解析之后就会认出这点。对于不包含任何代码的页面,ASP.NET引擎会在这个环节上缩短它的响应,并且继续标准的服务器处理程序。在IIS 5(ASP 版本3.0)中,标准的ASP页面就已经开始缩短无代码页面的响应时间。因此,不包含任何代码的ASP以及ASPX页面只比标准的HTML页面慢一点点。

客户端怎么与动态页面交互
那客户端是怎么与动态页面交互的呢?简单的回答是这样的:和其他任何种类的请求的处理模式一模一样。请记住,客户端和服务器几乎不了解对方。事实上,除了知道服务器的地址,客户端通常是完全摒弃服务器端的信息,然后服务器需要知道足够的客户端信息以保证可以提供适当的响应。
新的网络程序员通常会为客户端怎样响应动态及静态页面请求而感到疑惑。记住的要点是:对于客户端,请求的是动态页面或是静态页面是没有区别的。例如,对于客户端,请求一个aspx页面或者是HTML页面是没有区别的。记住,客户端基于MIME类型头的值来解析响应——但是并没有为动态生成的页面准备的特殊的MIME类型。MIME类型头对与动态或者静态页面是完全相同的。
HTML什么时候不够用
在这一章,我曾经提到几种不同的MIME类型的响应。这些类型非常重要,因为对于HTML本山来说,它并不是特别强大。幸运的是,现在变成网络程序员恰是好时候。浏览器已经过了幼年期(版本2和3),蹒跚期(版本4),并且在让其变成应用应用程序承载平台的路上有了很大的进步。尽管它们还是没有像Windows表单(Form)那么强大,但是在过去的五年中,它们取得了很大的进步,并且已经可以以一种很强大的方式操作HTML以及XML信息。
这些改变发生就是因为HTML是一种布局型语言。HTML不是一种样式语言,因此,层叠样式表才变得流行。HTML也不是一个图像描述或者是操作语言,因次,文档对象模型(DOM)才能帮你操作屏幕上对象的现实方式和位置。HTML也不是一个好的翻译和描述通用数据的语言,因此,XML才能变成现在浏览器工具集的一个组成部分。最后,对于这本书而言,最重要的是,HTML也不是一个编程语言。你必须使用某种编程语言来实施可用性检查以及逻辑操作。现代浏览器在某种程度上都是支持脚本语言的。
在IE 5x,或者网景6x,这些技术已经变得同气连枝。你既可以通过操作CSS或者XSL/XSLT来操作XML。你也可以使用DOM来改变层叠样式表并且动态改变目标的显示属性。你既可以直接用CSS(像是改变鼠标的形状)响应某些用户时间,也可以通过脚本来响应或者忽略所有的用户事务。
C#能做什么
既然你已经要让你自己使用服务器端最新的科技来创建动态页面应用,你应该知道C#可以做什么。让人意外的是,当你把网络编程变成这样几个组成部分的时候,网络编程和标准的应用程序编程之间的差距就很小了。
做If/Then的判断
If/Then是编程的关键。C#能够基于已知的标准做出判断。例如,判断一个用户是否以管理员,监督员或者是工人登录。C#能够选择适当的权限标准和响应。
使用判断代码,C#能够用于在文件中实现部分代码,包含或者不包含整个文件,或者是为一个特定的人在特定的时间创建全新的内容。
处理来自客户端的信息
一旦你创建了一个应用程序,你就需要处理来自客户端的信息。例如,当用户填好了表格,你需要验证这些信息,也许会把他们存储起来以备将来之需,并且反馈给用户。使用C#,你拥有访问用户发送所有信息的权限,并且你拥有对于服务器响应的完全控制。你可以使用你已知的编程经验来处理验证信息,保存数据到硬盘,并且格式一个响应。除了给予你一个可以做这是事情的编程语言,C#还提供了对于网络应用程序的更多支持。
C#网络应用程序使用ASP.NET框架来帮助你验证用户输入。例如,你可以在屏幕上放置一个控制,该控制可以保证请求域包含一个值,并且自动检查这个值是否合法。C#网络应用程序提供了可以简化磁盘和数据库操作的对象并且让你可以轻松地操作XML,XSLT以及值组。使用C#,你可以写出像是客户端脚本的服务器端代码。换句话说,你能够写出存在于服务器端的代码,但是这些代码可以以集权的方式响应客户端事件而不是写出没那么强大,但是却很难调试的客户端脚本。ASP.NET能够通过会话对象帮助你为每一个用户维护数据,通过缓存减少你服务器的工作量,并且通过自动恢复横跨几个服务器的输入控制值来维护一个一致的虚拟状态。
访问数据和文件
在大部分应用中,你也许会需要读取和存储永久数据。相比以前的ASP版本,ASP.NET使用.NET框架提供了一个非常强大的文件访问机制。例如,许多商业应用会在晚上从一个主框架或者是数据库服务器接收数据。很典型的,程序员会写一个特别的预定程序来读取或者解析以及包装新的数据文件进入一个适合于当前应用的表单。经常的,业务中断发生在一些意外发生使得数据文件处理过晚或者从来没有出现过。
很相似的,你难道没有曾经写过这样一些程序么?这个程序会创建一个文件,之后你会试着访问它只是为了找到用户已经删除或者在中途移动过文件。我知道——你一定写过这样的防卫代码使得你的程序能够恢复或者至少可以优雅的退出,对吗?
如果程序本身可以和文件系统交互,每当一个特定的目录发生改变应用程序都能收到通知,那许多应用程序的书写和维护能够变得更加容易。例如,如果你能够写出一段代码,这段代码可以在数据从主框架到达之时立刻开始数据导入处理,那么你就可以避免写一段检查文件的改变的时间循环程序或者是一个即使没有数据还在不停运转的排程应用程序。
相似的,如果在用户删除一个核心文件的时候你可以收到一个通知,那么,你不但可以避免写一个防卫程序,并且可以在第一时间阻止问题的发生。
你会发现使用C#会比使用以前的任何编程语言都要 更加容易的实现这些任务。你会发现如果使用C#,那最常用的文件和数据库操作变得更加简单(尽管解释起来有些麻烦)。例如,其中一个最普通的操作就是在一个HTML表格中显示数据库的查询结果。如果在经典的ASP应用中使用VBScript或者是Jscript代码,你必须在查询返回的结果集中不停的循环并且把这些值放入你自己设计的表格中。而在C#中,你可以获取到数据集(dataset)并且使用循环器(Repeater)来完成乏味的循环操作。
使用XML,CSS,XSLT,以及HTML来格式化响应信息
正如我前面所说的,你已经完成了从你应用返回的响应的完全的控制。直到现在,网络应用程序开发者需要担心的不仅仅是浏览器以及应用程序客户端的版本问题,并且网络客户端类型的大爆炸也是一件极其复杂的问题。手持设备,精密的互联网存取硬件设备,寻呼机,网络电话以及不断增长的标准应用程序已经超出了人类可以企及的格式化需求。
过去,对于大部分有简单的HTML以及脚本需求的网页,你可以为其准备两到三个版本——一个是对于完全白痴的没有任何动态HTML以及脚本能力的浏览者,另一个是对于网景4,还有一个是对于IE 4已经更高版本。但是随着客户端的类型和数目的增多,为每一种新的客户端类型创建新的HTML页面已经变得越来越不可能了。幸运的是,层叠样式表CSS和XML向正确的方向迈进了一大步。
使用层叠样式表,你能够调整一个页面使得页面可以满足不同的分辨率,颜色深度,以及可用性。但是层叠样式表只会影响到内容的显示属性——但是只使用层叠样式表,你不能为不同的设备调整内容本身。然后,通过XML,CSS以及XSLT的组合,你可以让两样都做到最好。XML可以保存数据,XSLT通过客户端类型过滤数据,层叠样式表CSS会控制被过滤的数据是如何在客户端的屏幕上显示。
VS可以帮助你创建所有这些文件类型,并且C#可以让你有计划的操作他们。而结果就是满足客户端特定显示需求的HTML。
启动并且和.NET以及COM+对象通讯
在过去的一两年中,ASP最具扩展性的模型就是使用ASP页面比HTML页面更多一些,这些ASP页面能够启动以微软事务服务器(MTS)或者COM+应用为宿主的COM模块。微软叫这个是Windows DNA。如果你曾经使用这个模型建立过应用,你会发现几乎没有什么改变,除了安装,移动,重命名以及版本模块变得更加容易。当然,这并不是一个小改变。
在.NET出现之前,你必须使用C++或者Delphi来创建适合于网络应用程序的自由线程(Free-threaded)的COM对象。(更具体的来说,一些人的确用VB写过多线程,但是看起来并不好看,而这也不是一个程序员都会有的技能)如果你没有写过独立(Stand-alone)程序,多线程看起来并不是什么大问题。毕竟,大部分的独立程序以及客户-服务器端应用程序并不需要多线程。然而,在网络环境中,这确实是一个大问题。网络应用程序几乎总是面对多个同步用户,到目前为止,.NET作为一个像Java一样适合于网络应用的语言,它必须具有多线程的能力。许多经典的ASP的程序员都是从VB程序员移植而来,所以他们倾向于使用哪种语言来生成部件。不幸的是,用VB 5/6生成的DLL都是房间线程的(Apartment Threaded)。不需要讲得太详细,这意味着网络应用程序不能存储使用VB 5/6写的对象而不引起严重的性能问题。
C#生成的对象本身就是自由线程的,所以你的网络应用程序能够安全的存储用C#写成的对象。当然,你仍然必须应对因同步的使用你的对象所引起的多线程问题,但是你可以标记特定的的代码段为危险的(Critical),因此可以序列化(Serializing)的访问这些代码段。当然,这是一个不同的故事了。
C#也可以让你访问传统的COM DLL,所以你可以直接使用已经存在的二进制代码而不必再用.NET语言重写一遍。有一些争论关于到底需要多久你才能做这个。个人认为,你可以在几年内优雅的升级COM DLL为.NET版本。为了在.NET中使用已经存在的COM DLL,你需要“导入(Import)”类型库。一种是通过使用TlbImp.exe。该方法会创建一个你能够使用它调用方法以及类属性的“包(Wrapper)”。当然,使用包会有一个轻量级的代价,但是当另一种方法是重写并测试已知代码的时候,这个代价一般都是可以接受的。
你也可以使用一种相反的方法,那就是用非托管的C++,VB5/6,Delphi或者任何的COM可控诉(COM-complaint)语言导出(Export).NET的汇编程序集(Assembly)。为了做这个,你必须使用TlbExp.exe。这个工具可以创建一个类型库但是不会注册它。尽管TlbExp很容易被记住(它是Tlblmp的相反的工具),另一个叫做RegAsm.exe的工具既能够注册,也可以同时创建类型库。在RegAsm.exe后使用/tlb会告诉该工具穿件一个类型库文件。你也可以使用RegAsm.exe产检一个REG(注册)文件而不是真的在你的汇编程序集里注册,这种方式在当你创建一个要安装到其他机器上的应用的安装程序时非常有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值