1、- 1 - 网络编程的技术解析 1.A 的身份验证 A 的身份验证有有三种,分别是 “Windows | Forms | Passport“,其中又以 Forms 验证用的最多,也最灵活。 Forms 验证方式对基于用户的验证授权提供了很好的支持,可以通过一个登录页面验证用户的身份,将此用户的身份发回到客户端的 Cookie,之后此用户再访问这个 web 应用就会连同这个身份 Cookie 一起发送到服务端。服务端上的授权设置就可以根据不同目录对不同用户的访问授权进行控制了。 下面大概的看一下 Forms 的过程。 Forms 身份验证基本原理: 要采用 Forms 身份验证,先要在应用程序根
2、目录中的 Web.config 中做相应的设置 : 其中 表示本应用程序采用 Forms 验证方式。 1. 标签中的 name 表示指定要用于身份验证的 HTTP Cookie。默认情况下, name 的值是 .ASPXAUTH。采用此种方式验证用户后 ,以此用户的信息建立一个 FormsAuthenticationTicket 类型的身份验证票 ,再加密序列化为一个字符串 ,最后将这个字符串写到客户端的 name 指定名字的 Cookie 中 .一旦这个Cookie 写到客户端后 ,此用户再次访问这个 web 应用时会将连同 Cookie 一起发送到服务端 ,服务端将会知道此用户是已经验证过
3、的 . 再 看 一 下 身 份 验 证 票 都 包 含 哪 些 信 息 呢 , 我 们 看 一 下FormsAuthenticationTicket 类 : CookiePath: 返回发出 Cookie 的路径。注意,窗体的路径设置为 /。由于窗体区分大小写,这是为了防止站点中的 URL 的大- 2 - 小写不一致而采取的一种保护措施。这在刷新 Cookie 时使用 Expiration: 获取Cookie 过期的日期 /时间。 IsPersistent: 如果已发出持久的 Cookie,则返回 true。否则,身份验证 Cookie将限制在浏览器生命周期范围内。 IssueDate: 获取
4、最初发出 Cookie 的日期 /时间。 Name: 获 取与身份验证 Cookie 关联的用户名。 UserData :获取存储在 Cookie 中的应用程序定义字符串。 Version: 返回字节版本号供将来使用。 2.标签中的 loginUrl 指定如果没有找到任何有效的身份验证Cookie,为登录将请求重定向 到的 URL。默认值为 default.aspx。 loginUrl 指定的页面就是用来验证用户身份的 ,一般此页面提供用户输入用户名和密码 ,用户提交后由程序来根据自己的需要来验证用户的合法性 (大多情况是将用户输入信息同数据库中的用户表进行比较 ),如果验证用户有效 ,则生成
5、同此用户对应的身份验证票 ,写到客户端的 Cookie,最后将浏览器重定向到用户初试请求的页面 .一般是用 FormsAuthentication.RedirectFromLoginPage 方法来完成生成身份验证票 ,写回客户端 ,浏览器重定向等一系列的动作。 public static void RedirectFromLoginPage( string userName, bool createPersistentCookie, string strCookiePath ); 其中 userName: 就是此用户的标示 ,用来标志此用户的唯一标示 ,不一定要映射到用户账户名称 . cre
6、atePersistentCookie: 标示是否发出持久的 Cookie。若不是持久 Cookie, Cookie 的有效期 Expiration 属性有当前时间加上 web.config中 timeout 的时间,每次请求页面时,在验证身份过程中,会判断是否过了有效期的一半,要是的话更新一次 cookie 的有效期;若是持久 cookie, Expiration 属性 无 意 义 , 这 时 身 份 验 证 票 的 有 效 期 有 cookie 的 Expires 决定,RedirectFromLoginPage 方法给 Expires 属性设定的是 50 年有效期。 - 3 - strC
7、ookiePath: 标示将生成的 Cookie 的写到客户端的路径,身份验证票中保存这个路径是在刷新身份验证票 Cookie 时使用(这也是生成 Cookie 的 Path),若没有 strCookiePath 参数,则使用 web.config 中 path 属性的设置。 这里可以看到 ,此方法参数只有三个 ,而身份验证票的属性有七个 ,不足的四个参数是这么来的 : IssueDate: Cookie 发出时间由当前时间得出。 Expiration:过期时间由当前时间和下面要说的 标签中 timeout 参数算出。此参数对非持久性 cookie 有意义。 UserData: 这个属性可以用
8、应用程序写入一些用户定义的数据 ,此方法没有用到这个属性 ,只是简单的将此属性置为空字符串 ,请注意此属性 ,在后面我们将要使用到这个属性。 Version: 版本号由系统自动提供 . RedirectFromLoginPage 方 法 生 成 生 成 身 份 验 证 票 后 , 会 调 用FormsAuthentication.Encrypt 方法,将身份验证票加密为字符串,这个字符串将会是以 .ASPXAUTH 为名字的一个 Cookie 的值。这个 Cookie 的其它属性的生成:Domain, Path 属性为确省值, Expires 视 createPersistentCookie
9、参数而定,若是持久 cookie, Expires 设为 50 年以后过期;若是非持久 cookie, Expires 属性不设置。 生成身份验证 Cookie 后,将此 Cookie 加入到 Response.Cookies 中,等待发送 到 客 户 端 。 最 后 RedirectFromLoginPage 方 法 调 用FormsAuthentication.GetRedirectUrl 方法获取到用户原先请求的页面,重定向到这个页面。 3. 标签中的 timeout 和 path,是提供了身份验证票写入到 Cookie 过期时间和默认路径。 以上就是基于 Forms 身份验证的过程,它
10、完成了对用户身份的确认。下面介绍基于 Forms 身份验证的访问授权。 - 4 - 验证了身份,是要使用这个身份,根据不同的身份我们可以进行不同的操作,处理,最常见的就是对不同的身份进行不同的授权, Forms 验证就提供这样的功能。 Forms 授权是基于目录的,可以针对某个目录来设置访问权限,比如,这些用户可以访问这个目 录,那些用户不能访问这个目录。同样,授权设置是在你要控制的那个目录下的 web.config 文件中来设置: 标签表示允许访问,其中的属性 1. users:一个逗号分隔的用户名列表,这些用户名已被授予对资源的访问权限。问号 (?) 允许匿名用户;星号 (*) 允许所有用
11、户。 2. roles:一个逗号分隔的角色列表,这些角色已被授予对资源的访问权限 。 3. verbs:一个逗号分隔的 HTTP 传输方法列表,这些 HTTP 传输方法已被授予对资源的访问权限。注册到 ASP.NET 的谓词为 GET、 HEAD、 POST 和DEBUG。 标签表示不允许访问。其中的属性同上面的。 在运行时,授权模块迭代通过 和 标记,直到它找到适合特定用户的第一个访问规则。然后,它根据找到的第一项访问规则是 还是 规则来允许或拒绝对 URL 资源的访问。 Machine.config 文件中的默认身份验 证规则是 , 因此除非另行配置,否则在默认情况下会允许访问。 2.AS
12、P.NET 调用 存储过程 - 5 - 在使用 .NET 的过程中,数据库访问是一个很重要的部分,特别是在 B/S 系统的构建过程中,数据库操作几乎成为了一个必不可少的操作。调用存储过程实现数据库操作使很多程序员使用的方法,而且大多数的程序员都是能使用存储过程就使用存储过程,很少直接使用 SQL 语句,所以存储过程是很有用而且很重要的。 1.存储过程简介 简单的说,存储过程是由一些 SQL 语句和控制语句组成的被封装起来的过程,它驻留在 数据库中,可以被客户应用程序调用,也可以从另一个过程或触发器调用。它的参数可以被传递和返回。与应用程序中的函数过程类似,存储过程可以通过名字来调用,而且它们同
13、样有输入参数和输出参数。 根据返回值类型的不同,我们可以将存储过程分为三类:返回记录集的存储过程, 返回数值的存储过程(也可以称为标量存储过程),以及行为存储过程。顾名思义,返回记录集的存储过程的执行结果是一个记录集,典型的例子是从数据库中检索出符合某一个或几个条件的记录;返回数值的存储过程执行完以后返回一个值,例如在数据库中执行一个有 返回值的函数或命令;最后,行为存储过程仅仅是用来实现数据库的某个功能,而没有返回值,例如在数据库中的更新和删除操作。 2.使用存储过程的好处 相对于直接使用 SQL 语句,在应用程序中直接调用存储过程有以下好处: (1)减少网络通信量。调用一个行数不多的存储过
14、程与直接调用 SQL 语句的网络通信量可能不会有很大的差别,可是如果存储过程包含上百行 SQL 语句,那么其性能绝对比一条一条的调用 SQL 语句要高得多。 (2)执行速度更快。有两个原因:首先,在存储过程创建的时候,数据库已经对其进行了一次解析和优化。其次,存储过程 一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用。 - 6 - (3)更强的适应性:由于存储过程对数据库的访问是通过存储过程来进行的,因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动,而这些改动不会对应用程序造成影响。 (4) 布式工作:应用程序和数据库的编码
15、工作可以分别独立进行,而不会相互压制。 由以上的分析可以看到,在应用程序中使用存储过程是很有必要的。 存储过程的调用方法 为了突出新方法的优点,首先介绍一下在 .NET 中调用存储过程的 “ 官方 ”方法 。另外,本文的所有示例程序均工作于 SqlServer 数据库上,其它情况类似,以后不再一一说明。本文所有例子均采用 C#语言。 要在应用程序中访问数据库,一般性的步骤是:首先声明一个数据库连接SqlConnection,然后声明一个数据库命令 SqlCommand,用来执行 SQL 语句和存储过程。有了这两个对象后,就可以根据自己的需要采用不同的执行方式达到目的。需要补充的是,不要忘记在页
16、面上添加如下的引用语句: Imports System.Data.SqlClient。 就执行存储过程来说,如果执行 的是第一类存储过程,那么就要用一个DataAdapter 将结果填充到一个 DataSet 中,然后就可以使用数据网格控件将结果呈现在页面上了;如果执行的是第二和第三种存储过程,则不需要此过程,只需要根据特定的返回判定操作是否成功完成即可。 3.ADO.NET 的设计目标 随着应用程序开发的发展演变,新的应用程序已基于 Web 应用程序模型越来越松散地耦合。如今,越来越多的应用程序使用 XML 来编码要通过网络连接传递的数据。 Web 应用程序将 HTTP 用作在层间进行通信的
17、结构,因此它们必须显式处理请求之间的状态 维护。这一新模型大大不同于连接、紧耦合的编程风格,此风格曾是客户端 /服务器时代的标志。在此编程风格中,连接会在程序的整个生存期中保持打开,而不需要对状态进行特殊处理。 - 7 - 在设计符合当今开发人员需要的工具和技术时, Microsoft 认识到需要为数据访问提供全新的编程模型,此模型是基于 .NET Framework 生成的。 基于 .NET Framework 这一点将确保数据访问技术的一致性 组件将共享通用的类型系 统、设计模式和命名约定。 设计 ADO.NET 的目的是为了满足这一新编程模型的以下要求:具有断开式 数据结构;能够与 XM
18、L 紧密集成;具有能够组合来自多个、不同数据源的数据的通用数据表示形式;以及具有为与数据库交互而优化的功能,这些要求都是 .NET Framework 固有 的内容。 在创建 ADO.NET 时, Microsoft 具有以下设计目标。 ADO.NET 的设计满足了当今应用程序开发模型的多种要求。同时,该编程模型尽可能地与 ADO 保持一致,这使当今的 ADO 开发人员不必从头开始学习全新的数据访问技术。 ADO.NET 是 .NET Framework 的固有部分,因此对于 ADO 程序员决不是完 全陌生的。 ADO.NET 与 ADO 共存。虽然大多数 基于 .NET 的新应用程序将使用
19、ADO.NET 来编写,但 .NET 程序员仍然可以通过 .NET COM 互操作性服务来使用 ADO。 有关 ADO 和 ADO.NET 之间的差异的论述,请参见 http:/ 上的“ADO.NET for the ADO Programmer”。 支持 N 层编程模式 ADO.NET 为断开式 n 层编程环境提供了 一流的支持,许多新的应用程序都是为该环境编写的。使用断开式数据集这一概念已成为编程模型中的焦点 。 n 层编程的 ADO.NET 解决方案就是 DataSet。 集成 XML 支持 XML 和数据访问是紧密联系在一起的,即 XML 的全部内容都是有关数据编码的,而数据访问越来越
20、多的内容都与 XML 有关。 .NET Framework 不仅支持 Web 标准,它还是完全基于 Web 标准生成的。 - 8 - XML 支持内置在 ADO.NET 中非常基本的级别上 。 .NET Framework 和ADO.NET 中的 XML 类是同 一结构的一部分,它们在许多不同的级别集成。您不必在数据访问服务集和它们的 XML 相应服务之间进行选择;它们的设计本来就具有从其中一个跨越到另一个的功能。 为什么需要 Web Service 在通过 Internet 网购买商品后,你可能对配送方式感到迷惑不解。经常的情况是因配送问题找配送公司而消耗你的大量时间,对于配送公司而言这也不
21、是一项增值服务。 为了解决这种问题,配送公司需要在不降低安全级别的情况下了解更多的递送信息,然而安全公司设计的安全系统却非常复杂。那么我们能不能只使用 80 端口( web 服务器端口)并且只通过 web 服务器提供信息呢?所以,我们建立了一个全新的 web 应用程序以便从核心商业应用程序中获得数据。配送公司将为些东西付 money,所有的公司都希望能够将注意力集中在核心商业应用上。 什么是 Web Service? Web Service 是一种构建应用程序的普通模型,并能在所有支持 Internet 网通讯的操作系统上实施。 Web Service 令基于组件的开发和 web 的结合达到最
22、佳,基于组件的对象模型: Distributed Component Object Model (DCOM), Remote Method Invocation (RMI), 和 Internet Inter-Orb Protocol (IIOP) 都已经发布很长时间了,不幸的是这些模型都依赖于特殊对象模型协议 。 Web Service 利用 soap和 Xml对这些模型在通讯方面作了进一步的扩展以消除特殊对象模型的障碍。 Web Service 主要利用 http 和 soap 协议使商业数据 在 web 传输, saop 通过 http 调用商业对象执行远程功能调用 ,web 用户能够使
23、用 soap 和 http 通过 web调用的方法来调用远程 对象。 那么怎样使在位置 a 的用户明白位置 b 的 Web Service 的意思呢?这个问题可以通过和一个一致的共同标准来回答。描述性服务语言( Service Description Language (SDL)), soap 订约语言( SOAP Contract Language (SCL) )和网络访问- 9 - 规范语言( Network Accessible Specification Language (NASSL) )都是为这个目的建立的相似语言,然而 IBM 和微软都同意 Web Service Descrip
24、tion Language (WSDL)作为 Web Service 的标准语言。 Web Service 部件的结构由 Web Service Description Language.描述, wsdl1.1是一份 Xml 文档,描述了 Web Service 的属性和接口。新的规范可以在 了解到。 最好的学习方法是创建一个 Web Service,我们以一个股票报价系统为例,纳斯达克和澳大利亚股票交易系统都是非常有名的例子,他们都提供了一个接口,用于输 入公司代码和接受最终成交的股票价格。我们复制一个相同的功能的 Web Service。我们的 Web Service 的输入参数是股票代码, Web Service 通过调用中间层商业逻辑函数获得股票价格,商业逻辑函数保持以最小的部分集中在 Web Service 上。实现这个应用程序的核心部件将是微软 .net framework sdk,我的配置是:操作系统 windows 2000 server, pIII300,300mb 内存。创建 Web Service 的首选集成开发环境 (IDE)是 visual ,你可以用任何一种文本编辑器( wordpad,notepad,visual studio6.0)轻易创建一个 Web Service 文件。