不知道是否侵权,如果不侵权的话我会慢慢把所以翻译的都发上来的。希望对想学习ASP.NET的人有帮助。
翻译的书是:A. Russell Jones的Mastering ASP.Net with C#. 从一楼起我会陆续贴上来的
Mastering ASP.NET with C#
第一章: 屏幕之后 — 网络应用程序是怎样工作的
综述
在你能更好的理解一个C#应用可以做到之前,你需要在大概念上理解什么会发生当一个网络请求出现时。因为一个网络应用通常是一些简单的HTML页面以及更复杂的动态页面的组合,你需要理解服务器是怎么样满足那些不需要代码的网络请求。相当一大部分的后台会话以及数据的传输甚至是发生在用户的请求到达你的代码之前。
一个网络应用被很自然的分成至少两层——客户端和服务器端。这一章节的目的在于给予你一个有关客户端和服务器端通讯的清楚的理解。另外,你将会学到怎么样把C#融合到这种通讯中并且它能怎么帮你实现网络应用程序。
网络请求(Web Request)是怎样工作的
一个网络请求需要两个部分,网络服务器(Web Server)和客户端(Client)。客户端(在当前)通常是一个浏览器(Browser),但是它也可以是另外一种程序,例如,蜘蛛程序(Spider) (蜘蛛程序是一种在网络连接间爬行并收集信息的程序)或者是一个代理(agent) (代理是一种目的在于找到特定的信息——通常是通过搜索引擎——的程序),一个标准的执行程序,一个无线设备,或者是一个发自嵌入性程序芯片中的请求,比如冰箱。这本书主要面向但不仅仅局限于浏览器客户端。因此,你可以认为浏览器和客户端和其他的书中讲的是同样的概念。我会提前知会你什么时候这些概念是不可替换的。
服务器和客户端通常在不同的计算机上,但是这并不是必需的。你可以使用一个浏览器来向运行在同一台电脑上的服务器上请求页面——事实上,那可能是在你的开发机上运行大部分书中例子的设置方法。问题在于:无论服务器和客户端是否在同一台机器上或者是地球两端的不同机器上,请求应该是按照几乎相同的方式工作的。
服务器和客户端使用提前订好的协议(Protocol)来互相通讯。协议就是用一个两方都同意的方法来初始化一个会话(Session),来回传递信息,并且停止会话。一些协议用于网络通讯,最普通的就是用于网页请求的超文本传输协议(HTTP),用于加密网页请求的安全的超文本传输协议(HTTPS),用于二进制文件数据传输的文件传输协议(FTP),用于新闻组的网络新闻传输协议(NNTP)。然而无论协议是如何使用,网络请求都是依托在一个叫做传输控制协议/互联网协议(TCP/IP)的网络协议,该协议是一个可以决定两台电脑交换信息的基本传输标准。
服务器计算机耐心的等待,直到一个请求到达来初始化通讯。在一个网络应用程序中,客户端总是会发送初始化信息来启动一个会话——而服务器只能相应。你会发现如果只写独立程序会有一些挫败感。会话初始化过程包含一系列预定于的字节(Byte)串。字节内容不重要——唯一重要的事情是两台计算机认为这些字节串是初始化信息。当一个服务器收到初始化请求,它会返回另一个字节串给客户端来证明它知道了这个传输。两台计算机的交谈会以这种来回应答的方式继续下去。如果计算机会说话,你可以想象这个对话是这样进行的:
客户端:你好?
服务器:你好。我说英语
客户端:我也说英语
服务器:有什么可以为你做的?
客户端:我想要一个在/mySite/myFiles/file1.htm的文件
服务器:那个文件已经被移动到/mySite/oldFiles/file1.htm
客户端:不好意思。再见。
服务器:再见。
客户端:你好?
服务器:你好。我说英语
客户端:我也说英语
服务器:有什么可以为你做的?
客户端:我想要一个在/mySite/oldFiles/file1.htm的文件
服务器:这里是那个文件的一些信息。
客户端:谢谢。请发给我数据。
服务器:开始传输,发送包(Packet)1,发送包2,发送包3… …
客户端:我收到包1,包2有错误,我收到包3,我收到包4.
服务器:重新发送包2.
这次通许持续到传输结束。
服务器:所有的包已发送。
客户端:所有的包正常接收。再见。
服务器:再见
TCP/IP协议是众多计算机传输协议的一种,但是因为计算机的普及,它变得无所不在。你不需要知道太多关于怎么使用TCP/IP协议——底层协议几乎就是完全透明的。然后,你确实需要知道一点点关于一台机器怎样找到另一台机器并发起一个会话。
客户端请求的内容是什么
当你在浏览器地址栏里面输入一个请求或者是点击一个超链接,浏览器会打包请求并且发送URL一个重要的部分,也就是域名,到一个域名解析服务器,通常叫做DNS服务器。这个DNS服务器一般位于你的互联网服务提供商(ISP)处。域名解析服务器维护了一个数据库的域名,每一个域名都对应于一个IP地址。计算机不识字,所以域名解析服务器就把请求地址翻译成数字。你在连接中或者地址栏看到的文本格式的域名事实上是一个对于人类友好的IP地址。IP地址是一组介于0-255的四个数字,中间以冒号分隔:例如,204.285.113.34。每一个三元组是一个八位位组。
每一个IP地址唯一地确定一台计算机。如果在第一个域名解析服务器的数据库中没有找到请求的地址,它就会转发该请求到更高一层的域名解析服务器。最后,如果没有一个域名解析服务器能翻译该请求到一个IP地址,该请求就会到达其中某个最高层的域名解析服务器,该服务器维护了所有公共注册的IP地址。如果没有域名解析服务器能解析该地址,一个失败的解析应答会沿着域名解析服务器传到你的浏览器。届时,你会看到一个错误信息。
如果域名解析服务器发现IP地址请求的题目,她会缓存该请求,以便不再需要联系更高一层的域名解析服务器。缓存时间会在一定的时间内失效,叫做存活时间(TTL),所以如果下一个请求超过了TTL,域名解析服务器,就会依据下一次到来的请求,务必联系更高一层的服务器。域名解析服务器会返回IP地址到浏览器,浏览器会使用该IP地址来联系相应的网络服务器。许多网络页面包含到其他文件的引用,这些文件必须由服务器提供以保证页面的完整性。然后,浏览器只能一次请求一个文件。比如:网页中的图像请求需要对每一个图像的独立请求。因此,显示一个页面的过程通常包含一系列服务器和浏览器之间的通讯。更典型的情况是,浏览器先接收主页面,之后处理它来找到其他的文件引用,同时,在请求引用文件的同时开始显示主要页面。这就是为什么在一个页面加载的时候你经常看到“占位符”。主页面包含对其他包含图片的文件的引用,但是,主页面不能包含图片本身。
服务器是怎么响应的——准备
从服务器端来看,每一次通讯都是一次新的客户端和服务器端的接触。默认来说,服务器按照先来先服务(First-come, first-serve)的次序处理请求。服务器不会“记得”任何特定的浏览器。现代的浏览器以及服务器使用HTTP的1.1版本,该版本以保持通讯可用(Keep-alive Connection)的方式实现。正如你预料的那样,这意味着连接本身,一旦建立,就能够在一些列的请求时保持可用,而不需要服务器和客户端之间为每一个文件都重新查找IP和初始化。尽管HTTP以该方式实现,每个文件的发送仍然需要一个独立的请求和相应循环。
URL的构成
那行你键入浏览器地址栏,并用来请求文件的文字被叫做通用地址定位器(URL)。服务器按照一个标准程序来处理每一个请求。首先,它通过分解URL成不同的部分来分析请求。”/”,”:”,”.”,”?”以及”&”——都叫做分隔符——使得分隔非常简单。每个部分都有一个特定的功能。以下是一个简单的URL请求:
http://www.microsoft.com:80/CSharpASP/default.htm?Page=1&&Para=2
以下部分显示了那个URL请求每一部分的名称和功能。
HTTP 协议。告诉服务器该使用什么协议来相应请求。
www.microsoft.com 域名。这部分会翻译成IP地址。域名本身包含几个部分,这几个部分被”.”分隔成几个部分:主机名,www;企业域名,microsoft;已经顶级域名,com。一共只有几个顶级域名,包括org(组织),gov(政府),以及net(互联网)
80 端口。一个服务器有很多端口,每一个指定一个服务器的“监听”地点。一个端口号就是指定一个特定的地点(一共有65537个可能的端口)。随着时间的推移,端口的使用变得特殊。例如,在例子中我使用了80号端口,因为这是标准的(默认的)HTTP端口号。但是你可以让服务器使用任何端口监听请求。
CSharpASP 虚拟路径。服务器会把这个名字翻译成一个在硬盘上的物理路径。一个虚拟路径是一个速记名,一个指向物理路径的“指针”。虚拟路径和物理路径的名字不需要相同。一种定义虚拟路径的方式是通过服务器的管理接口(Administrative Interface)。另一种方式是通过在VS.NET创建一个新的网络应用或者是网络服务工程来创建虚拟路径。例如,当你创建一个新的网络应用程序或者网络服务工程,VS.NET会为你创建一个虚拟路径。
default.htm 文件名。服务器会返回文件的内容给客户端。如果文件被服务器认为是一个可执行文件(例如ASP文件)而不是一个HTML文件,服务器会执行这个包含在文件中的程序并且返回结果给客户端显示而不是返回文件本身的内容。如果文件没有被认出来,服务器会提供文件的下载给客户端。
?(问号)分隔符。问号可以用来从URL请求中分隔请求和附加参数(Parameter)。我们的URL例子包含两个参数:
Page=1 and Para=2.
Page 参数名。那些你写的程序,例如ASP页面,能够读取参数并且利用它们来传递信息。
=(等号)分隔符。等号用于把参数名和参数值分开。
1 参数值。参数Page的值为1。注意:浏览器会以一个字符串的方式发送所有的参数。字符串(String)是一系列的字符:一个单词(Word)是一个字符串,一个句子(Sentence)是一个字符串,一个随机数字和字母序列是一个字符串——任何形式的文字都是一个字符串。你的程序可以自由的解析只包含数字形式字符的字符串为数字,但是为了安全起见,你应该强制转换这些字符串为数字模式。
& (与)分隔符。”&”分隔参数-值对。
Para=2 第二个参数名和参数值。
服务器翻译URL路径
你不必使用“真的”或者物理路径来处理物理请求。你可以使用虚拟路径来请求页面。当解析URL完成,服务器会把虚拟路径翻译成物理路径。例如,URL中的虚拟路径http://myServer/myPath/myFile.asp 是myPath。myPath虚拟路径会映射到本地路径,例如:C:/inetpub/wwwroot/CSharpASP/myFile.asp或者是映射到一个网络通用名称会话(UNC)名,例如://someServer/somePath/CSharpASP/myFile.asp.
服务器检查资源
服务器会定位请求的文件。如果文件不存在,服务器会返回一个错误信息——通常是HTTP 404——文件没有找到。你可能在浏览网站的时候已经看到这个错误信息;如果没有,你比我幸运多了。
服务器检查权限
在定位到资源之后,服务器会检查请求的账户是否有足够的权限来访问资源。默认来说,网络信息服务器(IIS)请求会使用一个叫做IUSR_Machinename的帐号,这个Machinename是服务器计算机的名称。你经常会听到“匿名”账户,因为服务器没有办法得知发起请求用户的任何真正的账户信息。对于ASP.NET页面,IIS会使用SYSTEM账户或者另一个叫做“aspnet_wp_account (ASPNET)”的Guest账户
例如,如果用户用户请求一个它没有阅读权限的文件,服务器会返回一个错误信息,通常是HTTP 403——访问被拒绝。实际的错误文字依赖于生成的特定的错误。例如,403错误信息有几种子错误。你能够在IIS默认的网站属性对话框找到完整的错误列表。服务器提供了默认的错误信息,但是它也允许你去定制错误信息。默认来说,IIS会从你的系统根目录 %SystemRoot%/ help/common/ directory读取错误信息,这里,变量%SystemRoot%代表你的NT路径名,通常是叫做winnt。
服务器是怎么响应的——实现
图像文件,Word文档,HTML文件,ASP文件,可执行文件,CGI脚本——服务器是怎么知道怎么处理这些不同的请求文件的呢?事实上,服务器会用不同的方式区分这些文件类型。
IIS像Windows的资源管理器那样使用不同的文件后缀来区分不同的文件类型,例如,.asp,.htm,.exe,等等。当你在资源管理器中双击一个文件或者图标,它会在注册表中查找文件扩展名,注册表是一个特殊的数据库,它保存了系统和应用程序信息。注册表为每一种注册的文件扩展名保存了一个条目。每一个扩展名有一个相应的文件类型条目。每一个文件类型条目有一个相应的可执行文件或者文件处理程序。服务器在文件名中提取扩展名,查找相关的程序,并且启动那个程序来返回相应的文件。IIS遵循了相同的步骤来决定怎样响应请求。
其他的服务器也使用文件扩展名来决定怎么处理一个文件请求,但是他们不使用注册表相关的方法。相应的,他们使用的独立的文件扩展名-程序关联(File Extension-to-Program Association)列表。列表中的条目叫做MIME类型,意味着多目的互联网邮件扩展(Multipurpose Internet Mail Extension),因为电子邮件程序需要知道邮件中的内容的不同类型。每一个MIME类型——就像注册表关联——对应于一个特定的程序或者动作。服务器会搜索目录列表来找到匹配请求文件扩展名的条目。大部分服务器会通过提供下载文件的方式来处理那些找不到匹配的扩展名的文件。一些服务器对于那些不包含文件名的URL提供了一个默认的动作。在这个例子中,大部分服务器会返回一些默认的文件列表——通常是叫做default.htm或者是index.htm的文件。你也可以为你的服务器配置默认的文件名,或者是对于在那个服务器上的所有的虚拟路径,也可以是那个服务器上每一个特定的虚拟路径。
当服务器生成响应时,它会开始把这些响应变成数据流,或者它会缓冲所有的响应,并且当响应完成时一次性的发送他们。响应分为两个部分:响应头(Response Header)和响应体(Response Body)。响应头包含了响应类型的信息。响应头也可以包含以下的部分:
响应代码
相应的MIME类型
响应的过期日期和时间
重定向URL
服务器想要存在客户端的任何Cookie值
Cookie是浏览器保存在内存中或者在客户端计算机的硬盘中的文本字符串。Cookie可以存活在整个Session的活动期间或者它也可以存活到一个特定的过期时间。浏览器会发送一个包含网站以及接下来的请求的Cookie给服务器。
注意: 媒体大肆宣传过Cookie。一些人非常了解这个让人担心的技术,所以他们在浏览器里面设置“不允许Cookie”。这意味着浏览器不会接受Cookie,这会对你的网站有显著的影响因为你必须有其他的方式来关联一个独立的浏览器会话和存储在你应用的服务器层面的值。这种不使用Cookie的方式是有办法解决的,但是这些方法非常不方便,并且他们也不会存在于浏览器会话之间。
客户端如何处理响应
客户端,通常是浏览器,需要理解服务器响应的内容是什么形式。客户端会读取MIME类型头来决定内容的类型。对于大部分请求,MIME类型头或者是text/html或者是图像类型,例如image/gif,但是它也可以是一个文字处理文件,一个视频,或者是一个音频文件,一个动画,或者其他类型的文件。浏览器使用注册表值或者MIME类型列表来决定怎么显示文件。对于标准HTML以及图像文件,浏览器使用一个内置的显示引擎。对于其他的文件类型,浏览器会寻求其他应用或插件的帮助,例如,RealPlayer,微软的Office来显示信息。浏览器会把它所有的或者部分的窗口区域以“帆布”(Canvas)的形式来让应用或者插件来“画”他们的内容。
当响应体包含HTML,浏览器会把结构化标记(Markup)和内容从文件中分离开。然后它使用结构化标记来决定内容怎么布局。现代HTML文件可以包含几种不同类型的内容以及结构化标记,文字,以及图像;浏览器会用不同的方法来处理他们。这些最普通的文件类型包括:
层叠样式表(Cascading Style Sheets) 这些特定格式的文本文件包含了怎样格式HTML文件内容的指令。浏览器使用层叠样式表来给页面中不同的元素内容赋予不同的字体,边框,可视化,定位,以及其他格式化信息。层叠样式表类型能够包含在一个标签(Tag)中,它能够被放在HTML页面的任何一个独立的区域,或者是存在于一个完整的独立文件中。所有的这些需要在浏览器处理完主页面请求,但是还没有现在是屏幕上之前。
脚本(Script) 所有的浏览器都能执行JavaScript程序,虽然他们可能用不同的方式执行它。名称“JavaScript”特定的对应于在网景(Netscape)的JavaScript脚本语言,但是有两个接近的变种——微软的Jscript脚本语言和ECMAScript——他们有完全相同的语法并且支持一个几乎相同的命令集。
注意:Jscript脚本语言不同于JScript.NET——其实,JScript.NET是一个更稳定的微软开发出加在VS.NET中的JScript版本
除了JScript, IE还支持VBScript,这是VB在应用上的一个子集,相应的,它也是微软的VB.NET前身的一个子集。
ActiveX部件或Java Applets 这些小程序在客户端而不是服务器端执行。ActiveX部件只能在IE或者Windows平台上运行(在本书书写时,其市场占用率有60%之多),然后Java Applets可以在几乎所有的浏览器和平台上运行。
注意:你可以在http://www.ecma.ch/stand/ecma-262.htm找到完整的ECMA-262规范。
XML 可扩张性标识语言很类似于HTML——两周都包含标签和内容。这并不让人吃惊,因为两周都是从标准型通用标识语言(SGML)衍生而来。HTML的标签描述了怎样显示内容,以及在一个有限的范围内可以显示内容的功能。XML的标签描述了内容是什么。换句话说,HTML主要是一个标准化和现实语言,然而XML是一个内容描述语言。两种语言互为补充。XML被首先应用在IE4上为“通道(Channel)”技术服务,该服务是一种相对不成功的技术,它可以让人们从各种不同的网站上订阅信息。IE4拥有一个通道栏来帮助人们管理他们的通道订阅。随着IE5的出现,微软抛弃了通道技术,但是扩展了浏览器对于XML的理解和灵活度以使得你在今天能在HTML文件中提供数据“岛(Island)”。你也可以提交一个XML以及XSL/XSLT(XSL/XSLT是一种目的类似于层叠样式表但是比其更强大的用XML写成的规则语言)的组合来在客户端生成HTML代码。XML/XSL组合让你从服务器端卸下处理的重负,因此可以提升你网站的可量测性(Scalability)。网景6提供了一个不同的——以显示为目的的——更现代的支持XML的类型。网景的解析引擎可以合并XML以及CSS层叠样式表来直接定义XML的显示格式。然后,网景没有直接的支持XSLT的转换,所以在没有中间转换的情况下,显示会有一定的现实。