asp.net分布式布署经验

通过一个案例来理解分布式系统----通过了解MySpace的六次重构经历,来认识分布式系统到底该如何创建

2009年03月23日 星期一 下午 04:04

在每个里程碑,站点负担都会超过底层系统部分组件的最大载荷,特别是数据库和存储系统。接着,功能出现问题,用户失声尖叫。最后,技术团队必须为此修订系统策略。

  虽然自2005年早期,站点账户数超过7百万后,系统架构到目前为止保持了相对稳定,但MySpace仍然在为SQL Server支持的同时连接数等方面继续攻坚,Benedetto说,"我们已经尽可能把事情做到最好"。

  里程碑一:50万账户

  按Benedetto 的说法,MySpace最初的系统很小,只有两台Web服务器和一个数据库服务器。那时使用的是Dell双CPU、4G内存的系统。

  单个数据库就意味着所有数据都存储在一个地方,再由两台Web服务器分担处理用户请求的工作量。但就像MySpace后来的几次底层系统修订时的情况一样,三服务器架构很快不堪重负。此后一个时期内,MySpace基本是通过添置更多Web服务器来对付用户暴增问题的。

  但到在2004年早期,MySpace用户数增长到50万后,数据库服务器也已开始汗流浃背。

  但和Web服务器不同,增加数据库可没那么简单。如果一个站点由多个数据库支持,设计者必须考虑的是,如何在保证数据一致性的前提下,让多个数据库分担压力。

  在第二代架构中,MySpace运行在3个SQL Server数据库服务器上——一个为主,所有的新数据都向它提交,然后由它复制到其他两个;另两个全力向用户供给数据,用以在博客和个人资料栏显示。这种方式在一段时间内效果很好——只要增加数据库服务器,加大硬盘,就可以应对用户数和访问量的增加。

  里程碑二:1-2百万账户

  MySpace注册数到达1百万至2百万区间后,数据库服务器开始受制于I/O容量——即它们存取数据的速度。而当时才是2004年中,距离上次数据库系统调整不过数月。用户的提交请求被阻塞,就像千人乐迷要挤进只能容纳几百人的夜总会,站点开始遭遇"主要矛盾",Benedetto说,这意味着MySpace永远都会轻度落后于用户需求。

  "有人花5分钟都无法完成留言,因此用户总是抱怨说网站已经完蛋了。"他补充道。

  这一次的数据库架构按照垂直分割模式设计,不同的数据库服务于站点的不同功能,如登录、用户资料和博客。于是,站点的扩展性问题看似又可以告一段落了,可以歇一阵子。

  垂直分割策略利于多个数据库分担访问压力,当用户要求增加新功能时,MySpace将投入新的数据库予以支持它。账户到达2百万后,MySpace还从存储设备与数据库服务器直接交互的方式切换到SAN(Storage Area Network,存储区域网络)——用高带宽、专门设计的网络将大量磁盘存储设备连接在一起,而数据库连接到SAN。这项措施极大提升了系统性能、正常运行时间和可靠性,Benedetto说。

  里程碑三:3百万账户

  当用户继续增加到3百万后,垂直分割策略也开始难以为继。尽管站点的各个应用被设计得高度独立,但有些信息必须共享。在这个架构里,每个数据库必须有各自的用户表副本——MySpace授权用户的电子花名册。这就意味着一个用户注册时,该条账户记录必须在9个不同数据库上分别创建。但在个别情况下,如果其中某台数据库服务器临时不可到达,对应事务就会失败,从而造成账户非完全创建,最终导致此用户的该项服务无效。

  另外一个问题是,个别应用如博客增长太快,那么专门为它服务的数据库就有巨大压力。

  2004年中,MySpace面临Web开发者称之为"向上扩展"对"向外扩展"(译者注:Scale Up和Scale Out,也称硬件扩展和软件扩展)的抉择——要么扩展到更大更强、也更昂贵的服务器上,要么部署大量相对便宜的服务器来分担数据库压力。一般来说,大型站点倾向于向外扩展,因为这将让它们得以保留通过增加服务器以提升系统能力的后路。

  但成功地向外扩展架构必须解决复杂的分布式计算问题,大型站点如Google、Yahoo和Amazon.com,都必须自行研发大量相关技术。以Google为例,它构建了自己的分布式文件系统。

  另外,向外扩展策略还需要大量重写原来软件,以保证系统能在分布式服务器上运行。"搞不好,开发人员的所有工作都将白费",Benedetto说。

  因此,MySpace首先将重点放在了向上扩展上,花费了大约1个半月时间研究升级到32CPU服务器以管理更大数据库的问题。Benedetto说,"那时候,这个方案看似可能解决一切问题。"如稳定性,更棒的是对现有软件几乎没有改动要求。

  糟糕的是,高端服务器极其昂贵,是购置同样处理能力和内存速度的多台服务器总和的很多倍。而且,站点架构师预测,从长期来看,即便是巨型数据库,最后也会不堪重负,Benedetto说,"换句话讲,只要增长趋势存在,我们最后无论如何都要走上向外扩展的道路。"

  因此,MySpace最终将目光移到分布式计算架构——它在物理上分布的众多服务器,整体必须逻辑上等同于单台机器。拿数据库来说,就不能再像过去那样将应用拆分,再以不同数据库分别支持,而必须将整个站点看作一个应用。现在,数据库模型里只有一个用户表,支持博客、个人资料和其他核心功能的数据都存储在相同数据库。

  既然所有的核心数据逻辑上都组织到一个数据库,那么MySpace必须找到新的办法以分担负荷——显然,运行在普通硬件上的单个数据库服务器是无能为力的。这次,不再按站点功能和应用分割数据库,MySpace开始将它的用户按每百万一组分割,然后将各组的全部数据分别存入独立的SQL Server实例。目前,MySpace的每台数据库服务器实际运行两个SQL Server实例,也就是说每台服务器服务大约2百万用户。Benedetto指出,以后还可以按照这种模式以更小粒度划分架构,从而优化负荷分担。

  当然,还是有一个特殊数据库保存了所有账户的名称和密码。用户登录后,保存了他们其他数据的数据库再接管服务。特殊数据库的用户表虽然庞大,但它只负责用户登录,功能单一,所以负荷还是比较容易控制的。

  里程碑四:9百万到1千7百万账户

2005年早期,账户达到9百万后,MySpace开始用Microsoft的C#编写ASP.NET程序。C#是C语言的最新派生语言,吸收了C++和Java的优点,依托于Microsoft .NET框架(Microsoft为软件组件化和分布式计算而设计的模型架构)。ASP.NET则由编写Web站点脚本的ASP技术演化而来,是Microsoft目前主推的Web站点编程环境。

  可以说是立竿见影, MySpace马上就发现ASP.NET程序运行更有效率,与ColdFusion相比,完成同样任务需消耗的处理器能力更小。据技术总监Whitcomb说,新代码需要150台服务器完成的工作,如果用ColdFusion则需要246台。Benedetto还指出,性能上升的另一个原因可能是在变换软件平台,并用新语言重写代码的过程中,程序员复审并优化了一些功能流程。

  最终,MySpace开始大规模迁移到ASP.NET。即便剩余的少部分ColdFusion代码,也从Cold-Fusion服务器搬到了ASP.NET,因为他们得到了BlueDragon.NET(乔治亚州阿尔法利塔New Atlanta Communications公司的产品,它能将ColdFusion代码自动重新编译到Microsoft平台)的帮助。

  账户达到1千万时,MySpace再次遭遇存储瓶颈问题。SAN的引入解决了早期一些性能问题,但站点目前的要求已经开始周期性超越SAN的I/O容量——即它从磁盘存储系统读写数据的极限速度。

  原因之一是每数据库1百万账户的分割策略,通常情况下的确可以将压力均分到各台服务器,但现实并非一成不变。比如第七台账户数据库上线后,仅仅7天就被塞满了,主要原因是佛罗里达一个乐队的歌迷疯狂注册。

  某个数据库可能因为任何原因,在任何时候遭遇主要负荷,这时,SAN中绑定到该数据库的磁盘存储设备簇就可能过载。"SAN让磁盘I/O能力大幅提升了,但将它们绑定到特定数据库的做法是错误的。"Benedetto说。

  最初,MySpace通过定期重新分配SAN中数据,以让其更为均衡的方法基本解决了这个问题,但这是一个人工过程,"大概需要两个人全职工作。"Benedetto说。

长期解决方案是迁移到虚拟存储体系上,这样,整个SAN被当作一个巨型存储池,不再要求每个磁盘为特定应用服务。MySpace目前采用了一种新型SAN设备——来自加利福尼亚州弗里蒙特的3PARdata。

  在3PAR的系统里,仍能在逻辑上按容量划分数据存储,但它不再被绑定到特定磁盘或磁盘簇,而是散布于大量磁盘。这就使均分数据访问负荷成为可能。当数据库需要写入一组数据时,任何空闲磁盘都可以马上完成这项工作,而不再像以前那样阻塞在可能已经过载的磁盘阵列处。而且,因为多个磁盘都有数据副本,读取数据时,也不会使SAN的任何组件过载。

当2005年春天账户数达到1千7百万时,MySpace又启用了新的策略以减轻存储系统压力,即增加数据缓存层——位于Web服务器和数据库服务器之间,其唯一职能是在内存中建立被频繁请求数据对象的副本,如此一来,不访问数据库也可以向Web应用供给数据。换句话说,100个用户请求同一份资料,以前需要查询数据库100次,而现在只需1次,其余都可从缓存数据中获得。当然如果页面变化,缓存的数据必须从内存擦除,然后重新从数据库获取——但在此之前,数据库的压力已经大大减轻,整个站点的性能得到提升。

  缓存区还为那些不需要记入数据库的数据提供了驿站,比如为跟踪用户会话而创建的临时文件——Benedetto坦言他需要在这方面补课,"我是数据库存储狂热分子,因此我总是想着将万事万物都存到数据库。"但将像会话跟踪这类的数据也存到数据库,站点将陷入泥沼。

  增加缓存服务器是"一开始就应该做的事情,但我们成长太快,以致于没有时间坐下来好好研究这件事情。"Benedetto补充道。

  里程碑五:2千6百万账户

  2005年中期,服务账户数达到2千6百万时,MySpace切换到了还处于beta测试的SQL Server 2005。转换何太急?主流看法是2005版支持64位处理器。但Benedetto说,"这不是主要原因,尽管这也很重要;主要还是因为我们对内存的渴求。"支持64位的数据库可以管理更多内存。

  更多内存就意味着更高的性能和更大的容量。原来运行32位版本的SQL Server服务器,能同时使用的内存最多只有4G。切换到64位,就好像加粗了输水管的直径。升级到SQL Server 2005和64位Windows Server 2003后,MySpace每台服务器配备了32G内存,后于2006年再次将配置标准提升到64G。

  意外错误

  如果没有对系统架构的历次修改与升级,MySpace根本不可能走到今天。但是,为什么系统还经常吃撑着了?很多用户抱怨的"意外错误"是怎么引起的呢?

  原因之一是MySpace对Microsoft的Web技术的应用已经进入连Microsoft自己也才刚刚开始探索的领域。比如11月,超出SQL Server最大同时连接数,MySpace系统崩溃。Benedetto说,这类可能引发系统崩溃的情况大概三天才会出现一次,但仍然过于频繁了,以致惹人恼怒。一旦数据库罢工,"无论这种情况什么时候发生,未缓存的数据都不能从SQL Server获得,那么你就必然看到一个'意外错误'提示。"他解释说。

  去年夏天,MySpace的Windows 2003多次自动停止服务。后来发现是操作系统一个内置功能惹的祸——预防分布式拒绝服务攻击(黑客使用很多客户机向服务器发起大量连接请求,以致服务器瘫痪)。MySpace和其他很多顶级大站点一样,肯定会经常遭受攻击,但它应该从网络级而不是依靠Windows本身的功能来解决问题——否则,大量MySpace合法用户连接时也会引起服务器反击。

  "我们花了大约一个月时间寻找Windows 2003服务器自动停止的原因。"Benedetto说。最后,通过Microsoft的帮助,他们才知道该怎么通知服务器:"别开枪,是友军。"

  紧接着是在去年7月某个周日晚上,MySpace总部所在地洛杉矶停电,造成整个系统停运12小时。大型Web站点通常要在地理上分布配置多个数据中心以预防单点故障。本来,MySpace还有其他两个数据中心以应对突发事件,但Web服务器都依赖于部署在洛杉矶的SAN。没有洛杉矶的SAN,Web服务器除了恳求你耐心等待,不能提供任何服务。

  Benedetto说,主数据中心的可靠性通过下列措施保证:可接入两张不同电网,另有后备电源和一台储备有30天燃料的发电机。但在这次事故中,不仅两张电网失效,而且在切换到备份电源的过程中,操作员烧掉了主动力线路。

2007年中,MySpace在另两个后备站点上也建设了SAN。这对分担负荷大有帮助——正常情况下,每个SAN都能负担三分之一的数据访问量。而在紧急情况下,任何一个站点都可以独立支撑整个服务,Benedetto说。

  MySpace仍然在为提高稳定性奋斗,虽然很多用户表示了足够信任且能原谅偶现的错误页面。

  "作为开发人员,我憎恶Bug,它太气人了。"Dan Tanner这个31岁的德克萨斯软件工程师说,他通过MySpace重新联系到了高中和大学同学。"不过,MySpace对我们的用处很大,因此我们可以原谅偶发的故障和错误。" Tanner说,如果站点某天出现故障甚至崩溃,恢复以后他还是会继续使用。

  这就是为什么Drew在论坛里咆哮时,大部分用户都告诉他应该保持平静,如果等几分钟,问题就会解决的原因。Drew无法平静,他写道,"我已经两次给MySpace发邮件,而它说一小时前还是正常的,现在出了点问题……完全是一堆废话。"另一个用户回复说,"毕竟它是免费的。"Benedetto坦承100%的可靠性不是他的目标。"它不是银行,而是一个免费的服务。"他说。

  换句话说,MySpace的偶发故障可能造成某人最后更新的个人资料丢失,但并不意味着网站弄丢了用户的钱财。"关键是要认识到,与保证站点性能相比,丢失少许数据的故障是可接受的。"Benedetto说。所以,MySpace甘冒丢失2分钟到2小时内任意点数据的危险,在SQL Server配置里延长了"checkpoint"操作——它将待更新数据永久记录到磁盘——的间隔时间,因为这样做可以加快数据库的运行。

  Benedetto说,同样,开发人员还经常在几个小时内就完成构思、编码、测试和发布全过程。这有引入Bug的风险,但这样做可以更快实现新功能。而且,因为进行大规模真实测试不具可行性,他们的测试通常是在仅以部分活跃用户为对象,且用户对软件新功能和改进不知就里的情况下进行的。因为事实上不可能做真实的加载测试,他们做的测试通常都是针对站点。

  "我们犯过大量错误,"Benedetto说,"但到头来,我认为我们做对的还是比做错的多。"

MySpace Tech Roster

January 16, 2007

By David F. Carr



我的一些思考:
看完这篇文章首先很惊讶myspace居然是基于.net平台的系统,windows2003+asp.net+IIS+SQLSERVER,虽然我是一个纯粹的MS技术者,但是对于MS的WEB应用总是有点疑虑,我的担心大概是来自于到处都在鼓吹的LAMP,我并不敌视开源,但是我承认,它给我带来了很大的压力.看了这篇文章,我有点庆幸也有点笑自己之前的迂腐,其实对于技术来说,优劣只在于开发者本身,myspace的六次重构,很好的说明了这一点.
我们常常讲分布式系统,这个概念很大,简单点说,就是把系统给拆分开来,把本来一台服务器做的事,分到两台服务器来做.如果只在一台服务器上部署两个程序来执行之前一个程序做的事,我认为那不叫分布式,也是完全没必要的,分布式的原则是"后分布"(lazy distribute),因为这本身是件损耗性能的工作,如果不能通过它来获得明显的性能提升,那为什么还要分布式?
myspace的六次重构基本都是围绕数据库来进行的,做了这么多年的WEB应用,我早就知道了数据库对于一个网站来说是多么的重要.在程序没有额外的问题的基础上,随着流量的增大,最先出现问题的,往往就是数据库.症状通常为,数据库查询/更新变的非常非常的慢,经常超时等.
这个时候,我们能做的事非常有限,无非是调整下SQLServer的内存大小,给服务器加内存换速度更快的硬盘等.如果要认真的解决这个问题,对于一般的开发者来说,都会自然的想到拆库.海量的数据查询对于SQL来说本就是不该存在的,无论你的数据库优化的多么好,比如你用的Oracle,数据吞吐量很大,难道查询100W的记录会比SQL查询1W条更快吗?拆库又分本地数据库分多个表和多个服务器分多个库,执行顺序为由前到後,当数据库的压力由海量查询变成磁盘IO之后,就需要更多的数据库服务器了.
除了硬件手段,更常用的是采用缓存.myspace直到第四次改版的后期才开始正式的引入缓存策略,这确实是个失误,如果从最开始就考虑到缓存的作用的话,那么数据库服务器至少不会膨胀的那么快,也可以有更多的时间来思考更好的架构.当然,正如Benedetto所说,这是件一开始就该考虑的事,但是myspace成长的太快了.
不是谁都有机会来为一个流量在世界上排名前10的网站来设计架构,因此myspace的后面的若干次重构,对于普通的开发者已经很难接触了,我认为,在第三个里程碑时,也就是通过服务器的横向扩展来实现的分布式,已经足够支持巨型网站的应用了.myspace是个交互型特别强的网站,用户执行的请求数会远大于一般的网站,这也是它巨大的数据库压力的来源.
最后总结一下WEB系统分布式的要点:
1.不到需要,绝对不要分布
2.分布式应该围绕数据库展开
3.分布式系统本身具有很强的扩展性,系统性能的提升和硬件的增加是线性关系.

  • 1
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

内容简介   本书是一本集技能、范例、项目和应用为一体的学习手册,书中介绍了应用asp.net进行程序开发的各种技术和技巧。全书分4篇,共23章。第1篇技能学习篇,主要包括asp.net技术基础、c#语言基础、流程语句控制和数组、面向对象编程、常用服务器控件、内置对象、验证控件、ado.net数据库开发技术、数据控件的应用、web用户控件、asp.net缓存技术、ajax无刷新技术、linq数据库访问技术、程序调试与错误处理等内容;第2篇范例演练篇,主要包括web开发应用基础、图形图像与多媒体、网站策略与安全、网站开发架构设计等相关的范例;第3篇模块开发篇,主要包括龙行天下搜索引擎、明日知道、ajax校内数码相册、明日网络硬盘等4个小型项目;第4篇商业系统篇,主要包括一个大型的商业项目,即企业级通用进销存软件开发web版。    本书附有配套dvd光盘,光盘中提供了书中全部实例和项目的源代码,这些源代码全部经过精心调试,能够在windows xp、windows server 2003及windows 7操作系统下编译和运行。    本书适用于asp.net的初学者、编程爱好者,同时也可以作为培训机构、大中专院校老师和学生的学习参考用书。 目录 第1篇 技能学习篇 第1章 淘我人生第一桶金——从学asp.net开始 ] 6个编程技术要点 ] 8个编程技巧说明 ] 5个编程注意事项 ] 2个实例应用详解 1.1 本章学习任务 4 1.1.1 本章能学到什么 4 1.1.2 实践检验真理 4 1.2 web开发基础知识 5 1.2.1 两大网络应用体系 5 1.2.2 html与http 5 1.2.3 动态页面与静态页面 5 1.3 走近asp.net 3.5 6 1.3.1 追溯asp.net发展史 6 1.3.2 asp.net新特性 6 1.3.3 asp.net网站运行原理 6 1.3.4 .net framework介绍 7 1.4 asp.net开发利器——visual studio 2008 8 1.4.1 visual studio 2008简介 8 .1.4.2 安装visual studio 2008(windows server 2003/windows 7) 8 1.4.3 配置visual studio 2008(windows server 2003/windows 7) 12 1.4.4 iis安装和配置(windows server 2003/windows 7) 13 1.5 万丈高楼平地起——asp.net网页语法 15 1.5.1 asp.net网页扩展名 15 1.5.2 常用页面指令 15 1.5.3 注释aspx文件内容 16 1.5.4 asp.net服务器控件标记语法 17 1.5.5 代码块语法 18 1.5.6 表达式语法 19 1.6 开发初体验——第一个asp.net网站 20 1.6.1 创建asp.net网站 20 1.6.2 设计web页面 21 1.6.3 运行应用程序 23 1.6.4 在网站中添加资源文件夹 23 1.7 最好的学习老师——使用msdn辅助编程 24 1.7.1 msdn的安装 24 1.7.2 利用msdn帮助学习 26 1.8 实战检验 28 1.8.1 设置visual studio 2008开发环境中显示代码行号 28 1.8.2 如何中断正在运行的程序 29 1.9 疑难解惑 29 1.9.1 c#和.net有什么关系 29 1.9.2 visual studio 2008安装不上 29 1.10 精彩回顾 30 第2章 asp.net必修课——c#语言基础入门 ] 20个编程技术要点 ] 11个编程技巧说明 ] 3个编程注意事项 ] 12个实例应用详解 2.1 本章学习任务 32 2.1.1 本章能学到什么 32 2.1.2 实践检验真理 32 2.2 c#语言轻松入门 32 2.2.1 快速入门——从第1个c#程序说起 32 2.2.2 创建并运行c#控制台应用程序 34 2.2.3 没有规矩不成方圆——c#代码书写规则 36 2.2.4 相得益彰——c#与.net的完美结合 37 2.3 数据类型 37 2.3.1 值类型的使用 37 2.3.2 引用类型的使用 41 2.3.3 “箱子”学问——装箱和拆箱 42 2.4 变量和常量 43 2.4.1 变量的命名规则与惯例 43 2.4.2 仓库与盒子的学问——数据类型与变量 43 2.4.3 变量的声明与赋值 44 2.4.4 变量的作用域和生存周期 44 2.4.5 常量的定义 45 2.5 数据类型转换 45 2.5.1 隐式类型转换 45 2.5.2 显式类型转换 46 2.6 运算符及表达式 47 2.6.1 算术运算符 47 2.6.2 赋值运算符 48 2.6.3 关系运算符 48 2.6.4 逻辑运算符 49 2.6.5 三目运算符 50 2.6.6 运算符的优先权 50 2.7 实战检验 51 2.7.1 静态方法与局部变量的应用 51 2.7.2 利用运算符判断用户名称和密码 52 2.8 疑难解惑 52 2.8.1 值类型和引用类型区别 52 2.8.2 c#基础语言中是否有全局变量 52 2.8.3 c#字符类型中的string和sting区别 52 2.9 精彩回顾 52 第3章 峰回路转——流程语句控制和数组 ] 10个编程技术要点 ] 6个编程技巧说明 ] 12个编程注意事项 ] 14个实例应用详解 3.1 本章学习任务 56 3.1.1 本章能学到什么 56 3.1.2 实践检验真理 56 3.2 使用if/switch选择(分支)语句 57 3.2.1 使用if…else语句实现条件选择 57 3.2.2 if语句的嵌套 60 3.2.3 使用switch语句实现多分支选择 64 3.3 使用for/foreach循环 65 3.3.1 简化重复程序代码for循环 65 3.3.2 使用foreach语句遍历集合或数组 67 3.4 使用while/do...while循环语句 68 3.4.1 请出示通行证——while循环 68 3.4.2 先上车后补票——do…while循环 69 3.5 排成一串的“变量”——数组 70 3.5.1 数组概念 70 3.5.2 一维数组 71 3.5.3 二维数组 72 3.5.4 多维数组 73 3.6 实战检验 74 3.6.1 会员注册 74 3.6.2 数组排序 75 3.7 疑难解惑 76 3.7.1 使用for语句应该注意什么 76 3.7.2 如何跳出while循环 76 3.8 精彩回顾 77 第4章 独占鳌头——面向对象编程 ] 17个编程技术要点 ] 17个编程技巧说明 ] 9个编程注意事项 ] 11个实例应用详解 4.1 本章学习任务 80 4.1.1 本章能学到什么 80 4.1.2 实践检验真理 80 4.2 面向对象编程知多少 81 4.2.1 解析面向对象 81 4.2.2 面向对象三大支柱 82 4.3 家族核心——类与类成员 83 4.3.1 绘制家谱——用asp.net创建类 83 4.3.2 家族权力——类的定义及其访问权限 85 4.3.3 展现家族——实例化类对象 86 4.3.4 家族成员——类的成员字段 87 4.3.5 家族行为——类的成员方法 89 4.3.6 家族特征——类的成员属性 91 4.3.7 构造函数和析构函数 94 4.4 神秘金字塔——封装特性 96 4.4.1 揭密封装特性 96 4.4.2 封存“埃及法老” 97 4.5 子承父业——继承特性 98 4.5.1 “继承”家族概况 98 4.5.2 一脉单传——单继承 98 4.5.3 四世同堂——接口和多重继承 99 4.6 性相近习相远——多态特性 103 4.6.1 万千世界,多态体验 103 4.6.2 多态体验之一:重载(overload) 104 4.6.3 多态体验之二:重写(override) 105 4.7 实战检验 106 4.7.1 显式接口成员实现 106 4.7.2 “这是我定义的一个方法!” 107 4.8 疑难解惑 108 4.9 精彩回顾 108 第5章 网页基本元素——常用服务器控件 ] 13个编程技术要点 ] 20个编程技巧说明 ] 11个编程注意事项 ] 12个实例应用详解 5.1 本章学习任务 112 5.1.1 本章能学到什么 112 5.1.2 实践检验真理 112 5.2 文本类型控件 113 5.2.1 label控件 113 5.2.2 textbox控件 115 5.3 按钮类型控件 119 5.3.1 button控件 119 5.3.2 imagebutton控件 121 5.4 选择类型控件 122 5.4.1 listbox控件 122 5.4.2 dropdownlist控件 126 5.4.3 radiobutton控件 130 5.4.4 checkbox控件 132 5.5 图形显示类型控件 134 5.5.1 image控件 134 5.5.2 imagemap控件 137 5.6 fileupload文件上传控件 139 5.6.1 fileupload控件概述 139 5.6.2 fileupload控件的属性 139 5.6.3 fileupload控件的方法 141 5.7 实战检验 142 5.7.1 dropdownlist控件中添加listbox控件选择的项目 142 5.7.2 限制上传文件的大小 143 5.8 疑难解惑 144 5.8.1 控件自动回发服务器,网页总是刷新 144 5.8.2 使用fileupload控件时上传目录的问题 145 5.9 精彩回顾 145 第6章 程序开发效率之利器——内置对象 ] 25个编程技术要点 ] 10个编程技巧说明 ] 3个编程注意事项 ] 15个实例应用详解 6.1 本章学习任务 148 6.1.1 本章能学到什么 148 6.1.2 实践检验真理 148 6.2 程序响应对象:response 149 6.2.1 response对象概述 149 6.2.2 response对象常用属性和方法 150 6.2.3 判断客户端是否连接服务器 150 6.2.4 使用redirect方法实现页面跳转 151 6.2.5 binarywrite方法输出二进制图像 151 6.3 程序请求对象:request 152 6.3.1 request对象概述 152 6.3.2 request对象常用属性和方法 152 6.3.3 获取客户端浏览器信息 153 6.3.4 站内搜索引擎 154 6.4 全局变量应用对象:application 155 6.4.1 application对象概述 155 6.4.2 application对象常用属性、方法 155 6.4.3 获取application对象数量 156 6.4.4 在线人数统计 156 6.5 会话信息处理对象:session 157 6.5.1 session对象概述 157 6.5.2 session对象常用属性和方法 157 6.5.3 判断用户是否登录 158 6.5.4 设置用户在线时间 159 6.6 客户端数据缓存对象:cookie 160 6.6.1 cookie对象概述 160 6.6.2 cookie对象常用属性和方法 160 6.6.3 使用cookie对象保存和读取客户端信息 161 6.6.4 利用cookie实现密码记忆功能 161 6.7 服务器信息处理对象:server 163 6.7.1 server对象概述 163 6.7.2 server对象常用属性和方法 163 6.7.3 获取服务器的物理地址 163 6.7.4 解决传递汉字丢失或乱码的问题 164 6.8 实战检验 165 6.8.1 利用application对象开发聊天室 165 6.8.2 在线投票系统 167 6.9 疑难解惑 170 6.9.1 session值丢失的问题 170 6.9.2 如何获取客户端的ip地址 170 6.10 精彩回顾 170 第7章 数据检验之利器——验证控件 ] 12个编程技术要点 ] 9个编程技巧说明 ] 4个编程注意事项 ] 7个实例应用详解 7.1 本章学习任务 174 7.1.1 本章能学到什么 174 7.1.2 实践检验真理 174 7.2 验证控件 175 7.2.1 什么是验证控件 175 7.2.2 验证控件的工作原理 175 7.2.3 结合多个验证控件 176 7.3 非空数据验证 176 7.3.1 requiredfieldvalidator控件 177 7.3.2 requiredfieldvalidator检查必要的输入 178 7.4 数据比较验证 179 7.4.1 comparevalidator控件 179 7.4.2 comparevalidator数据比较实例 180 7.5 数据范围验证 181 7.5.1 rangevalidator控件 182 7.5.2 rangevalidator验证范围实例 182 7.6 数据输入格式验证 183 7.6.1 regularexpressionvalidator控件 183 7.6.2 regularexpressionvalidator验证格式实例 185 7.7 验证错误信息汇总 187 7.7.1 validationsummary控件 188 7.7.2 validationsummary汇总错误信息 189 7.8 自定义验证控件(customvalidator) 190 7.9 屏蔽客户端验证功能 191 7.10 实战检验 192 7.10.1 限制用户名只能由数字、字母、汉字或下划线组成 192 7.10.2 以编程方式验证出生日期格式 193 7.11 疑难解惑 194 7.11.1 所有验证控件必须设置哪一属性来指定验证对象 194 7.11.2 验证控件的display属性值static和dynamic区别 194 7.11.3 是否可以通过编程方式来检验控件 194 7.12 精彩回顾 194 第8章 学富五车——ado.net数据库开发技术 ] 17个编程技术要点 ] 13个编程技巧说明 ] 5个编程注意事项 ] 8个实例应用详解 8.1 本章学习任务 198 8.1.1 本章能学到什么 198 8.1.2 实践检验真理 198 8.2 ado.net技术知多少 199 8.2.1 ado.net对象模型 199 8.2.2 趣味理解ado.net 199 8.3 建立数据库连接connection对象 200 8.3.1 一切从我开始——connection对象 200 8.3.2 串起数据珍珠链——数据库连接字符串 201 8.3.3 使用sqlconnection对象连接sql server数据库 202 8.3.4 使用oledbconnection对象连接access数据库 203 8.4 执行数据库命令command对象 204 8.4.1 执行sql命令好帮手——command对象 204 8.4.2 使用command对象添加联系人管理数据 207 8.4.3 使用command对象修改联系人管理数据 208 8.4.4 使用command对象删除联系人管理数据 209 8.4.5 高效率代码——调用存储过程管理联系人数据 209 8.5 连线模式数据访问datareader对象 211 8.5.1 节省内存最优秀——datareader对象 211 8.5.2 使用datareader对象获取数据 212 8.6 离线模式数据访问dataset和dataadapter 213 8.6.1 离线模式核心对象——dataset对象 213 8.6.2 桥梁架设工程师——dataadapter对象 214 8.6.3 填充并访问dataset表中数据 215 8.6.4 修改dataset并更新数据源(批量更新) 216 8.7 实战检验 218 8.7.1 使用参数化查询预防sql注入式攻击 218 8.7.2 应用存储过程有效预防sql注入式攻击 220 8.8 疑难解惑 221 8.8.1 数据库连线模式和离线模式的比较 221 8.8.2 ado.net中检索数据的经典步骤 221 8.8.3 dataset与datareader对象应用场合 222 8.9 精彩回顾 222 第9章 全方位数据访问——数据控件的应用 ] 14个编程技术要点 ] 11个编程技巧说明 ] 6个编程注意事项 ] 14个实例应用详解 9.1 本章学习任务 226 9.1.1 本章能学到什么 226 9.1.2 实践检验真理 226 9.2 gridview控件基本应用 226 9.2.1 关于gridview控件 226 9.2.2 gridview控件分页绑定数据 227 9.2.3 以编程方式实现选中、编辑和删除gridview数据项 228 9.3 gridview控件72般绝技 230 9.3.1 一次性编辑gridview控件的所有行中数据 230 9.3.2 在gridview控件中内嵌dropdownlist设置考试试卷状态 232 9.3.3 gridview控件中高亮显示行数据 233 9.3.4 在gridview控件中排序数据 234 9.3.5 在gridview控件中实现全选和全不选功能 236 9.4 灵活访问数据库:datalist控件 237 9.4.1 关于datalist控件 237 9.4.2 分页绑定datalist控件中数据(实现页面跳转功能) 237 9.4.3 使用datalist删除数据(支持批量删除) 240 9.4.4 在datalist控件中实现数据进行编辑操作 242 9.5 王牌现身:全新的listview控件 244 9.5.1 关于listview控件 244 9.5.2 使用listview控件显示数据 244 9.5.3 以独立的datapager控件设置listview控件的分页 246 9.6 实战检验 247 9.6.1 实现用“…”代替超长字符串 247 9.6.2 加入自动求和求平均值 248 9.7 疑难解惑 249 9.7.1 gridview控件分页导航条样式 249 9.7.2 datalist控件如何智能化查看详细信息 249 9.8 精彩回顾 250 第10章 组件加工厂——web用户控件 ] 7个编程技术要点 ] 4个编程技巧说明 ] 2个编程注意事项 ] 5个实例应用详解 10.1 本章学习任务 254 10.1.1 本章能学到什么 254 10.1.2 实践检验真理 254 10.2 web用户控件概述 255 10.2.1 web用户控件与web窗体比较 255 10.2.2 web用户控件的优点 255 10.3 创建及使用web用户控件 255 10.3.1 创建web用户控件 255 10.3.2 将web用户控件添加至网页 256 10.3.3 制作一个站内搜索用户控件 257 10.4 设置用户控件 258 10.4.1 访问用户控件的属性 258 10.4.2 访问用户控件中的服务器控件 259 10.5 实战检验 260 10.5.1 具有文件上传功能的用户控件 260 10.5.2 具有会员登录功能的用户控件 262 10.6 疑难解惑 263 10.6.1 什么情况下使用web用户控件 263 10.6.2 在web用户控件中不能弹出提示框 263 10.7 精彩回顾 263 第11章 以逸待劳——asp.net缓存技术 ] 8个编程技术要点 ] 11个编程技巧说明 ] 2个编程注意事项 ] 7个实例应用详解 11.1 本章学习任务 266 11.1.1 本章能学到什么 266 11.1.2 实践检验真理 266 11.2 asp.net缓存架构概述 267 11.2.1 新增功能 267 11.2.2 缓存的优点 267 11.3 网页输出缓存之完整网页缓存 268 11.3.1 完整网页缓存基本概念 268 11.3.2 以@ outputcacher指令声明网页输出缓存 268 11.3.3 使用页面输出缓存api 271 11.4 网页输出缓存之部分网页缓存 274 11.4.1 页面部分缓存概述 274 11.4.2 控件缓存 274 11.4.3 缓存后替换 276 11.5 实战检验 277 11.5.1 通过response.cache对象设置页面缓存有效期 277 11.5.2 使用cache类缓存一个变量值 278 11.6 疑难解惑 279 11.6.1 什么情况下使用缓存 279 11.6.2 指定页面缓存在服务器上 279 11.7 精彩回顾 279 第12章 asp.net完美体验——ajax无刷新技术 ] 23个编程技术要点 ] 8个编程技巧说明 ] 5个编程注意事项 ] 13个实例应用详解 12.1 本章学习任务 282 12.1.1 本章能学到什么 282 12.1.2 实践检验真理 282 12.2 迈向解密之路——asp. net ajax初体验 282 12.2.1 ajax开发模式 283 12.2.2 asp.net ajax优点 283 12.2.3 探讨asp.net ajax架构 284 12.3 asp. net ajax服务器端控件 284 12.3.1 脚本管理员——scriptmanager控件 284 12.3.2 局部更新面板——updatepanel控件 285 12.3.3 定时操作的最佳利器——timer控件 287 12.4 ajax完美体验——酷我交流聊天室 288 2.4.1 酷我交流聊天室概述 288 2.4.2 核心代码演练 289 12.5 炫酷效果营造者——ajax control toolkit 290 12.5.1 安装ajax control toolkit扩展控件工具包 290 12.5.2 密码安全提示——密码强度(passwordstrength) 291 12.5.3 相册播放器——播放照片(slideshow) 293 12.6 ajax炫酷体验——美丽星空许愿墙 294 12.6.1 美丽星空许愿墙概述 294 12.6.2 核心代码演练 295 12.7 实战检验 296 12.7.1 应用timer控件实现在线考试倒计时 296 12.7.2 应用textboxwatermark控件添加水印 297 12.8 疑难解惑 298 12.8.1 如何在ajax环境中弹出对话框 298 12.8.2 timer控件的使用模式有几种 298 12.8.3 服务器控件放在updatepanel外如何实现局部更新效果 298 12.9 精彩回顾 298 第13章 asp.net神来之笔——linq数据库访问技术 ] 20个编程技术要点 ] 15个编程技巧说明 ] 5个编程注意事项 ] 10个实例应用详解 13.1 本章学习任务 302 13.1.1 本章能学到什么 302 13.1.2 实践检验真理 302 13.2 崭新眼光看世界——认识linq 303 13.2.1 你好!linq 303 13.2.2 linq架构概览 303 13.2.3 为什么需要linq 304 13.3 linq查询初步——linq查询子句 305 13.3.1 有始有终——from与select子句 305 13.3.2 查询过滤器——where子句 306 13.3.3 数据分组——group by子句 306 13.3.4 数据排序——orderby子句 307 13.4 操作关系型数据——linq to sql 307 13.4.1 走近linq to sql 307 13.4.2 揭秘linq to sql查询 309 13.4.3 linq延迟执行模式 311 13.4.4 编程新体验——通过linq插入、更新和删除数据 312 13.5 使用linq操作dataset 316 13.5.1 揭秘linq to dataset 316 13.5.2 使用linq to dataset查询商品销售数据 316 13.6 操作xml——linq to xml 318 13.6.1 为什么需要linq to xml 318 13.6.2 使用linq to xml操作xml文件 318 13.7 实战检验 320 13.7.1 linq防止sql注入式攻击 320 13.7.2 linq to xml——合计xml元素值 320 13.8 疑难解惑 321 13.8.1 解决理念上的阻抗失调 321 13.8.2 linq并不仅仅用于查询 321 13.8.3 在容易混淆的地方使用var关键字 322 13.9 精彩回顾 322 第14章 钟馗捉妖——程序调试与错误处理 ] 25个编程技术要点 ] 5个编程技巧说明 ] 3个编程注意事项 ] 15个实例应用详解 14.1 本章学习任务 324 14.1.1 本章能学到什么 324 14.1.2 实践检验真理 324 14.2 “妖”之分类 325 14.2.1 千年小妖——语法错误 325 14.2.2 千年老妖——语义错误 325 14.2.3 万妖之王——逻辑错误 326 14.3 修练仙道——程序调试 326 14.3.1 仙术秘诀——设定断点 326 14.3.2 仙人指路——设定起始页 327 14.3.3 开始修练——调试断点 328 14.3.4 跨越险阻——中断执行 330 14.3.5 飞升成仙——停止执行 330 14.4 捕妖之术——asp.net中最佳异常处理 331 14.4.1 使用try…catch语句捕获异常 331 14.4.2 使用try…catch…finally捕获异常 333 14.5 实战检验 334 14.5.1 调试运行时错误 334 14.5.2 调试逻辑错误 335 14.6 疑难解惑 335 14.6.1 程序中的错误分为几类,分别是什么 335 14.6.2 怎样理解程序调试与错误处理中的异常 336 14.6.3 如何针对不同的异常进行捕捉 336 14.7 精彩回顾 336 第2篇 范例演练篇 第15章 实践检验真理——web开发应用基础 ] 20个编程技术要点 ] 15个编程技巧说明 ] 12个编程注意事项 ] 5个实例应用详解 15.1 完美备份与还原数据库 340 15.1.1 范例功能演示 340 15.1.2 开发思路指引 340 15.1.3 专家难点解析 341 15.1.4 设计过程详解 344 15.1.5 范例开发手记 346 15.1.6 进阶与提高 346 15.2 仿google扭曲验证码 347 15.2.1 范例功能演示 347 15.2.2 开发思路指引 348 15.2.3 专家难点解析 348 15.2.4 设计过程详解 350 15.2.5 范例开发手记 352 15.2.6 进阶与提高 352 15.3 分块下载文件 353 15.3.1 范例功能演示 353 15.3.2 开发思路指引 353 15.3.3 专家难点解析 354 15.3.4 设计过程详解 354 15.3.5 范例开发手记 356 15.3.6 进阶与提高 357 15.4 智能验证会员注册信息 357 15.4.1 范例功能演示 357 15.4.2 开发思路指引 358 15.4.3 专家难点解析 358 15.4.4 设计过程详解 361 15.4.5 范例开发手记 364 15.4.6 进阶与提高 365 15.5 利用word打印商品销售报表 366 15.5.1 范例功能演示 366 15.5.2 开发思路指引 366 15.5.3 专家难点解析 366 15.5.4 设计过程详解 367 15.5.5 范例开发手记 368 15.5.6 进阶与提高 368 第16章 打造多彩世界——图形图像与多媒体 ] 15个编程技术要点 ] 12个编程技巧说明 ] 20个编程注意事项 ] 5个实例应用详解 16.1 带进度条上传图片 370 16.1.1 范例功能演示 370 16.1.2 开发思路指引 370 16.1.3 专家难点解析 372 16.1.4 设计过程详解 374 16.1.5 范例开发手记 380 16.1.6 进阶与提高 380 16.2 在线图像无损压缩 381 16.2.1 范例功能演示 381 16.2.2 开发思路指引 381 16.2.3 专家难点解析 381 16.2.4 设计过程详解 383 16.2.5 范例开发手记 386 16.2.6 进阶与提高 387 16.3 在线收音机 387 16.3.1 范例功能演示 387 16.3.2 开发思路指引 388 16.3.3 专家难点解析 388 16.3.4 设计过程详解 389 16.3.5 范例开发手记 392 16.3.6 进阶与提高 392 16.4 图片在线裁剪 393 16.4.1 范例功能演示 393 16.4.2 开发思路指引 394 16.4.3 专家难点解析 394 16.4.4 设计过程详解 395 16.4.5 范例开发手记 397 16.4.6 进阶与提高 397 16.5 循环播放广告图片 398 16.5.1 范例功能演示 398 16.5.2 开发思路指引 398 16.5.3 专家难点解析 398 16.5.4 设计过程详解 399 16.5.5 范例开发手记 401 16.5.6 进阶与提高 401 第17章 筑起安全防火墙——网站策略与安全 ] 21个编程技术要点 ] 14个编程技巧说明 ] 4个编程注意事项 ] 5个实例应用详解 17.1 精忠报国——加密与解密web.config 404 17.1.1 范例功能演示 404 17.1.2 开发思路指引 404 17.1.3 专家难点解析 404 17.1.4 设计过程详解 405 17.1.5 范例开发手记 406 17.1.6 进阶与提高 406 17.2 幻影迷踪——加密与解密数据库中数据 407 17.2.1 范例功能演示 407 17.2.2 开发思路指引 407 17.2.3 专家难点解析 407 17.2.4 设计过程详解 408 17.2.5 范例开发手记 411 17.2.6 进阶与提高 411 17.3 一山不容二虎——用户单点登录 412 17.3.1 范例功能演示 412 17.3.2 开发思路指引 412 17.3.3 专家难点解析 413 17.3.4 设计过程详解 414 17.3.5 范例开发手记 415 17.3.6 进阶与提高 415 17.4 忠肝义胆——使用u口加密锁进行身份验证 416 17.4.1 范例功能演示 416 17.4.2 开发思路指引 416 17.4.3 专家难点解析 417 17.4.4 设计过程详解 417 17.4.5 范例开发手记 419 17.4.6 进阶与提高 419 17.5 三顾茅庐——会员密码三次找回功能 420 17.5.1 范例功能演示 420 17.5.2 开发思路指引 420 17.5.3 专家难点解析 421 17.5.4 设计过程详解 421 17.5.5 范例开发手记 424 17.5.6 进阶与提高 424 第18章 高级应用开发——网站开发架构设计 ] 25个编程技术要点 ] 15个编程技巧说明 ] 19个编程注意事项 ] 4个实例应用详解 18.1 两层架构在创建个人店铺中的应用 426 18.1.1 范例功能演示 426 18.1.2 开发思路指引 427 18.1.3 专家难点解析 428 18.1.4 设计过程详解 431 18.1.5 范例开发手记 433 18.1.6 进阶与提高 433 18.2 三层架构在基于xml技术留言本中的应用 434 18.2.1 范例功能演示 434 18.2.2 开发思路指引 434 18.2.3 专家难点解析 436 18.2.4 设计过程详解 437 18.2.5 范例开发手记 442 18.2.6 进阶与提高 443 18.3 多层架构在新闻发布系统中的应用 443 18.3.1 范例功能演示 443 18.3.2 开发思路指引 444 18.3.3 专家难点解析 445 18.3.4 设计过程详解 446 18.3.5 范例开发手记 449 18.3.6 进阶与提高 450 18.4 mvc框架在联系人管理网站中的应用 450 18.4.1 范例功能演示 451 18.4.2 开发思路指引 452 18.4.3 专家难点解析 453 18.4.4 设计过程详解 454 18.4.5 范例开发手记 459 18.4.6 进阶与提高 459 第3篇 模块开发篇 第19章 龙行天下搜索引擎——畅游神秘网络 ] 8个编程技术要点 ] 30个编程技巧说明 ] 20个编程注意事项 ] 1个实例应用详解 19.1 搜索引擎概述 464 19.1.1 开发背景 464 19.1.2 需求分析 464 19.1.3 系统目标 464 19.1.4 系统功能结构图 464 19.1.5 文件夹组织结构 465 19.1.6 系统预览 465 19.2 数据库设计 466 19.2.1 数据表概要说明 466 19.2.2 数据表的结构 466 19.3 关键技术详解 467 19.3.1 什么是lucene.net 467 19.3.2 lucene.net基本语法 467 19.3.3 lucene.net技术多字段搜索 470 19.3.4 关键字分词技术 470 19.3.5 高亮显示查询关键字 471 19.4 搜索引擎主页设计 472 19.4.1 模块功能展示 472 19.4.2 模块设计思路 472 19.4.3 模块功能实现 473 19.5 搜索引擎结果页设计 473 19.5.1 模块功能展示 473 19.5.2 模块设计思路 474 19.5.3 模块功能实现 474 19.6 程序调试与错误处理 480 第20章 明日知道——程序员的十万个问什么 ] 9个编程技术要点 ] 2个编程技巧说明 ] 3个编程注意事项 ] 1个实例应用详解 20.1 明日知道网站概述 482 20.1.1 开发背景 482 20.1.2 需求分析 482 20.1.3 系统目标 482 20.1.4 系统功能结构图 482 20.1.5 文件夹组织结构 483 20.1.6 系统预览 483 20.2 数据库设计 485 20.2.1 数据表概要说明 485 20.2.2 数据模型图 486 20.2.3 主要数据表的结构 486 20.3 关键技术详解 488 20.3.1 linq技术简介 488 20.3.2 linq to object技术应用 488 20.3.3 linq to sql技术应用 490 20.3.4 javascript和c#之间的互相调用与访问 492 20.3.5 页面传值方式 493 20.3.6 页输出缓存 494 20.3.7 应用程序缓存 495 20.4 提问模块 496 20.4.1 模块功能展示 496 20.4.2 模块设计思路 497 20.4.3 模块功能实现 498 20.5 回复模块 500 20.5.1 模块功能展示 500 20.5.2 模块设计思路 501 20.5.3 模块功能实现 502 20.6 设置最佳答案模块 506 20.6.1 模块功能展示 506 20.6.2 模块设计思路 507 20.6.3 模块功能实现 508 20.7 关闭问题模块 510 20.7.1 模块功能展示 510 20.7.2 模块设计思路 511 20.7.3 模块功能实现 511 20.8 搜索问题模块 512 20.8.1 模块功能展示 512 20.8.2 模块设计思路 514 20.8.3 模块功能实现 514 20.9 程序调试与错误处理 517 第21章 ajax校内数码相册——结合linq操作的完美体验 ] 11个编程技术要点 ] 7个编程技巧说明 ] 3个编程注意事项 ] 1个实例应用详解 21.1 ajax校内数码相册概述 520 21.1.1 开发背景 520 21.1.2 需求分析 520 21.1.3 系统流程图 520 21.1.4 构建开发环境 521 21.1.5 文件夹组织结构 521 21.1.6 系统预览 522 21.2 数据库设计 523 21.2.1 数据表概要说明 523 21.2.2 数据模型图 523 21.2.3 主要数据表的结构 524 21.3 关键技术详解 524 21.3.1 ajax异步的水平滚动照片(使用全新listview控件) 524 21.3.2 ajax扩展控件slideshow实现幻灯片效果 525 21.3.3 ajax密码强度提示及水印文本框 526 21.3.4 如何在母版页中使用updatepanel控件 527 21.3.5 应用linq防止sql注入式攻击 527 21.3.6 应用linq操作绑定在listview中的照片 528 21.3.7 通过linq to dataset操作相册分类并实现linq子查询 529 21.4 幻灯片播放数码照片 530 21.4.1 播放功能展示 530 21.4.2 模块设计思路 531 21.4.3 模块功能实现 531 21.5 创建相册分类并上传照片 532 21.5.1 模块功能展示 532 21.5.2 模块设计思路 533 21.5.3 模块功能实现 534 21.6 浏览和管理上传照片 535 21.6.1 模块功能展示 535 21.6.2 模块设计思路 536 21.6.3 模块功能实现 537 21.7 数码相册分类管理 539 21.7.1 分类管理展示 539 21.7.2 模块设计思路 539 21.7.3 模块功能实现 540 21.8 程序调试与错误处理 542 21.8.1 解决iis 7.5(windows 7)局域网内无法浏览网站 542 21.8.2 解决linq分页与数据绑定控件分页属性相冲突问题 543 第22章 明日网络硬盘——网络流行媒介 ] 10个编程技术要点 ] 7个编程技巧说明 ] 3个编程注意事项 ] 1个实例应用详解 22.1 网络硬盘概述 546 22.1.1 开发背景 546 22.1.2 需求分析 546 22.1.3 系统目标 546 22.1.4 系统功能结构图 546 22.1.5 文件夹组织结构 547 22.1.6 系统预览 547 22.2 数据库设计 548 22.2.1 数据表概要说明 548 22.2.2 数据表的结构 548 22.3 关键技术详解 549 22.3.1 上传文件 549 22.3.2 创建文件夹 550 22.3.3 删除文件或文件夹 550 22.3.4 文件或文件夹更名 551 22.3.5 下载文件 552 22.4 公共类设计 554 22.5 用户注册模块 556 22.5.1 模块功能展示 556 22.5.2 模块设计思路 557 22.5.3 模块功能实现 557 22.6 用户登录模块 559 22.6.1 模块功能展示 559 22.6.2 模块设计思路 559 22.6.3 模块功能实现 560 22.7 文件上传模块 561 22.7.1 模块功能展示 561 22.7.2 模块设计思路 561 22.7.3 模块功能实现 562 22.8 文件管理模块 563 22.8.1 模块功能展示 563 22.8.2 模块设计思路 563 22.8.3 模块功能实现 563 22.9 个人资料模块 574 22.9.1 模块功能展示 574 22.9.2 模块设计思路 575 22.9.3 模块功能实现 575 22.10 程序调试与错误处理 578 第4篇 商业系统篇 第23章 企业级通用进销存软件web版——结合多样asp.net前沿技术开发 ] 9个编程技术要点 ] 2个编程技巧说明 ] 2个编程注意事项 ] 1个实例应用详解 23.1 软件概述 584 23.2 系统分析 584 23.3 系统设计 585 23.3.1 项目总体规划 585 23.3.2 系统设计目标 586 23.3.3 系统流程图 586 23.3.4 系统功能结构 587 23.3.5 构建开发环境 588 23.3.6 文件夹组织结构 588 23.3.7 项目架构模式设计 589 23.3.8 系统预览 589 23.4 数据库设计 590 23.4.1 数据表概要说明 590 23.4.2 数据模型图 591 23.4.3 主要数据表的结构 593 23.4.4 创建数据库视图 597 23.4.5 创建存储过程 598 23.5 核心技术讲解 598 23.5.1 linq to objects技术介绍 598 23.5.2 linq to sql技术简介 599 23.5.3 应用linq to xml更换系统皮肤 600 23.5.4 应用linq 实现多表间的复杂查询 602 23.5.5 反射在实体间赋值的应用 603 23.5.6 自定义web组件开发——分页导航组件outpager 605 23.5.7 动态设置水晶报表数据源 606 23.5.8 泛型在多表数据提交中的应用 607 23.5.9 分布式事务协调器dtc技术应用 610 23.5.10 数据绑定控件与javascript应用 612 23.5.11 界面设计的“超级模板”——母版页 613 23.5.12 asp. net ajax无刷新技术应用 614 23.6 主要公共类的设计 615 23.6.1 更换网页皮肤主题类basepage 615 23.6.2 自定义gridview数据绑定控件类 616 23.6.3 自定义ourpager数据分页控件类 617 23.7 七大主要功能模块设计 620 23.7.1 货品信息管理 620 23.7.2 采购计划管理 627 23.7.3 入库单管理 631 23.7.4 销售单管理 635 23.7.5 库存盘点表 640 23.7.6 货品进销存统计 644 23.7.7 菜单权限设置 648 23.8 疑难问题分析与解决 653 23.8.1 页面缓存引起的问题 653 23.8.2 linq to sql缓存机制引起的问题 653 23.8.3 窗体验证模式引起的问题 653 23.8.4 开发自定义分页控件时的刷新问题 654 23.8.5 布署到iis服务器时涉及的文件访问权限的问题 654 23.9 程序调试与错误处理 655 23.9.1 读写xml时出现的错误 655 23.9.2 版本不一致的问题 655 23.10 核心技术和经验总结 656 23.10.1 single设计模式 656 23.10.2 工作单元模式 656 23.10.3 标志映射模式 659 23.10.4 面向接口的程序设计模式 659 23.10.5 多层次系统架构设计 659 23.10.6 关于开发自定义控件——组合控件的经验总结 659 23.10.7 软件设计和开发时把可扩展性放在第一位 659
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值