标题：构建高性能可扩展ASP.NET网站设计
基本信息
原书名：Ultra-Fast ASP NET: Build Ultra-Fast and Ultra-Scalable web sites using ASP NET and SQL Server
原出版社： Apress
作者：(美)Richard Kiessig
译者：余昭辉
丛书名： 图灵程序设计丛书
出版社：人民邮电出版社
ISBN：9787115248336
出版日期：2011 年3月
开本：16开
页码：369
版次：1-1
编辑推荐
让ASP NET + SQL Server网站
飞迅速提升网站性能，全面挖掘网站潜力
微软资深技术专家力作，亚马逊全五星评价
内容简介
《构建高性能可扩展asp net网站》针对asp net 网站开发中可能遇到的问题，给出了经过实践检验的具体解决方法。涉及的内容包括：加快显示html 的方法、缓存的最佳方式、如何使用iis、如何处理会话状态、如何配置sql server 以及如何优化基础设施等。
《构建高性能可扩展asp net网站》适用于所有web 开发和运维人员以及对优化网站感兴趣的读者
作译者
Richard Kiessig 有30多年的软件设计和开发经验。他目前是一名独立软件顾问，专注于使用ASP NET和SQL Server设计和构建大型网站。他给MySpace、微软等公司做过咨询。此前他在微软工作了四年，一开始做MSN的架构师并负责开 发工作，后来在微软技术中心（MTC）工作。
目录
《构建高性能可扩展asp net网站》
第1章 原则和方法 1
1 1 性能和可扩展性的差异 2
1 2 为什么需要高性能和高可扩展性 2
1 2 1 优化 3
1 2 2 过程 3
1 2 3 体验 4
1 3 完整的页面处理过程 4
1 4 原则概述 6
1 4 1 性能原则 6
1 4 2 次要技术 7
1 5 本书使用的环境和工具 8
1 5 1 软件工具和版本 8
1 5 2 术语 9
1 5 3 排版约定 9
1 5 4 作者网站 9
1 6 小结 10
第2章 客户端性能 11
2 1 浏览器页面处理 12
2 1 1 网络连接和初始http请求 12
2 1 2 页面解析和新的资源请求 13
2 1 3 页面资源的顺序以及重新排序 14
2 2 浏览器缓存 15
2 3 网络优化 16
2 4 脚本包含文件的处理 18
2 4 1 通过在脚本之前排队资源请求提高并行化 18
2 4 2 减少脚本文件的数量 19
2 4 3 在页面剩余时间里请求对象 21
2 4 4 脚本延迟 22
2 4 5 针对脚本的服务器端方法 22
2 5 少下载 22
2 5 1 减少每个页面中资源的数量 22
2 5 2 降低html、css和javascript的大小 24
2 5 3 最大化压缩 25
2 5 4 图片优化 25
2 5 5 网站图标文件 29
2 5 6 html、css和javascript的一般优化 29
2 6 使用javascript限定页面请求 32
2 6 1 提交按钮 33
2 6 2 链接 33
2 7 使用javascript降低html大小 34
2 7 1 生成重复的html 34
2 7 2 为标签添加重复文本 35
2 8 减少上传 36
2 9 css优化 38
2 10 图片精灵和集群 41
2 11 利用dhtml 43
2 12 使用ajax 43
2 13 使用silverlight 45
2 13 1 创建html控件 46
2 13 2 在javascript中调用silverlight内代码 48
2 13 3 使用silverlight改进性能的其他方式 49
2 14 提高呈现速度 50
2 15 预缓存 51
2 15 1 预缓存图片 51
2 15 2 预缓存css和javascript 52
2 16 使用css实现无表格的布局 53
2 17 优化javascript的性能 56
2 18 小结 57
第3章 缓存 59
3 1 在所有层中缓存 59
3 2 浏览器缓存 60
3 2 1 缓存静态内容 61
3 2 2 缓存动态内容 63
3 3 viewstate 65
3 4 cookie 71
3 4 1 设置会话cookie 71
3 4 2 单个cookie中多个名称/值对 72
3 4 3 cookie属性 72
3 5 silverlight独立存储 80
3 5 1 示例程序：“欢迎回来” 80
3 5 2 部署并更新silverlight应用 84
3 6 代理缓存 85
3 6 1 使用cache-control http头 85
3 6 2 管理相同内容的不同版本 87
3 7 web服务器缓存 87
3 7 1 windows内核缓存 87
3 7 2 iis 7输出缓存 92
3 7 3 asp net输出缓存 93
3 7 4 asp net对象缓存 98
3 8 sql server缓存 103
3 9 分布式缓存 104
3 10 缓存过期时间 105
3 10 1 动态内容 105
3 10 2 静态内容 105
3 11 小结 106
第4章 iis 7 108
4 1 应用程序池和web园 108
4 2 请求处理管道 110
4 3 windows系统资源管理器 111
4 4 常见的http问题 113
4 4 1 http重定向 114
4 4 2 http头 115
4 5 压缩 118
4 5 1 启用压缩 118
4 5 2 设置压缩选项 120
4 5 3 使用web config配置压缩 121
4 5 4 缓存压缩的内容 121
4 5 5 使用编程方式启用压缩 122
4 6 http keep-alive 122
4 7 优化url 122
4 7 1 虚拟目录 123
4 7 2 url重写 123
4 8 管理流量 126
4 8 1 使用robots txt 126
4 8 2 网站地图 127
4 8 3 带宽节流 128
4 9 跟踪失败请求 130
4 10 iis性能调校提示 133
4 11 小结 134
第5章 asp net线程与会话 135
5 1 线程影响可扩展性 135
5 2 asp net页面生命周期 136
5 3 应用程序线程池 137
5 3 1 同步页面 138
5 3 2 异步页面 138
5 3 3 负载测试 140
5 3 4 改进已有的同步页面的可扩展性 142
5 3 5 从单个页面上执行多个异步任务 143
5 3 6 超时处理 144
5 3 7 异步web服务 145
5 3 8 异步文件i/o 148
5 3 9 异步web请求 149
5 4 后台工作线程 151
5 4 1 使用后台线程记录日志 152
5 4 2 任务串行化 157
5 5 锁定指南和使用readerwriterlock 157
5 6 会话状态 158
5 6 1 会话id 159
5 6 2 inproc模式 159
5 6 3 使用stateserver 160
5 6 4 使用sql server 160
5 6 5 有选择的启用会话状态，使用readonly模式 161
5 6 6 可扩展性会话状态支持 162
5 6 7 调校 167
5 6 8 完全自定义会话状态 167
5 6 9 会话序列化 168
5 7 会话状态的其他方案 168
5 8 小结 169
第6章 使用asp net实现和管理优化技术 170
6 1 母版页 170
6 2 用户控件 173
6 2 1 示例 173
6 2 2 注册和使用控件 175
6 2 3 将控件放在dll中 175
6 3 主题 176
6 3 1 静态文件 176
6 3 2 皮肤 176
6 3 3 动态设定主题 176
6 3 4 可以放在主题里的属性 177
6 3 5 示例 178
6 3 6 预缓存主题图片 179
6 4 特定于浏览器的代码 179
6 4 1 使用request browser 181
6 4 2 特定于浏览器属性前缀 182
6 4 3 缓存特定于浏览器的页面 183
6 4 4 控件适配器 184
6 4 5 浏览器提供程序 185
6 4 6 伪装 187
6 5 动态生成javascript和css 187
6 5 1 示例 188
6 5 2 从javascript里访问asp net控件 189
6 6 给静态文件设置多个域名 190
6 7 修改图片大小 191
6 8 小结 193
第7章 管理asp net应用程序策略 194
7 1 自定义httpmodule 194
7 1 1 示例httpmodule的需求 195
7 1 2 init() 方法 195
7 1 3 prerequesthandlerexecute事件处理器 197
7 1 4 beginauthenticaterequest事件处理器 197
7 1 5 endauthenticaterequest事件处理器 199
7 1 6 endrequest事件处理器 200
7 1 7 数据库表和存储过程 201
7 1 8 在web config中注册该httpmodule 202
7 2 自定义httphandler 202
7 2 1 开始请求 203
7 2 2 结束请求 204
7 3 页面基类 205
7 4 页面适配器 206
7 4 1 示例：pagestatepersister 206
7 4 2 pageadapter类 207
7 4 3 注册pageadapter 208
7 5 url重写 208
7 5 1 在httpmodule中重写url 208
7 5 2 修改表单使用重写的url 209
7 6 标签转换 210
7 7 深入理解控件适配器 211
7 8 重定向 212
7 8 1 传统的重定向 212
7 8 2 永久重定向 213
7 8 3 使用server transfer() 213
7 9 尽早刷新响应 214
7 9 1 标记 214
7 9 2 隐藏文件 214
7 9 3 包跟踪 215
7 9 4 块编码 216
7 9 5 小结 217
7 10 过滤空格 218
7 11 避免不必要工作的其他方法 220
7 11 1 检查page ispostback 220
7 11 2 确定页面是否刷新 220
7 11 3 避免在回发之后重定向 220
7 11 4 检查response isclient- connected 221
7 11 5 关闭调试模式 221
7 11 6 批量编译 222
7 12 小结 222
第8章 sql server关系数据库 224
8 1 sql server如何管理内存 224
8 1 1 内存组织 225
8 1 2 读和写 225
8 1 3 性能影响 226
8 2 存储过程 226
8 3 批量命令 228
8 3 1 使用sqldataadapter 228
8 3 2 构建参数化命令串 231
8 4 事务 233
8 5 多结果集 238
8 5 1 使用sqldatareader  nextresult() 238
8 5 2 使用sqldataadapter和dataset 239
8 6 数据预缓存 240
8 6 1 方法 240
8 6 2 预缓存基于表单的数据 241
8 6 3 预缓存每次一个页面的数据 241
8 7 数据访问层 242
8 8 查询和结构优化 243
8 9 其他查询优化指导原则 251
8 10 数据分页 251
8 10 1 公用表表达式 251
8 10 2 数据分页的详细示例 252
8 11 对象关系模型 258
8 12 xml列 259
8 12 1 xml架构 260
8 12 2 创建示例表 261
8 12 3 基本xml查询 262
8 12 4 修改xml数据 263
8 12 5 xml索引 263
8 12 6 其他xml查询技巧 264
8 13 数据分区 264
8 13 1 分区函数 265
8 13 2 分区架构 265
8 13 3 生成测试数据 266
8 13 4 添加索引，配置锁升级 268
8 13 5 存档旧数据 269
8 13 6 小结 269
8 14 全文搜索 269
8 14 1 创建全文目录和索引 270
8 14 2 全文查询 271
8 14 3 获得搜索分级的细节 271
8 14 4 全文搜索语法小结 271
8 15 service broker 272
8 15 1 启用和配置service broker 273
8 15 2 发送消息的存储过程 274
8 15 3 使用存储过程接收消息 274
8 15 4 测试示例 275
8 15 5 避免中毒消息 276
8 16 通过service broker发送e-mail 276
8 16 1 创建后台工作线程 277
8 16 2 读取并处理信息 278
8 16 3 排队消息和发送邮件的web窗体 280
8 16 4 结果 282
8 17 数据变化通知 283
8 17 1 查询约束 283
8 17 2 示例：简单的配置系统 284
8 18 resource governor 287
8 18 1 配置 287
8 18 2 测试 290
8 19 横向扩展与纵向扩展 290
8 19 1 纵向扩展 290
8 19 2 横向扩展 291
8 19 3 确定系统瓶颈 292
8 20 高可用性 293
8 21 其他方面的性能提示 294
8 22 小结 295
第9章 sql server analysis services 297
9 1 分析服务概览 297
9 2 mddb示例 299
9 2 1 rdbms结构 299
9 2 2 数据源视图 300
9 2 3 cube 303
9 2 4 时间维度 303
9 2 5 items和users维度 305
9 2 6 计算的成员 306
9 2 7 部署和测试 307
9 3 示例mdx查询 307
9 4 adomd net 313
9 4 1 单个单元格结果示例 313
9 4 2 使用gridview显示多行结果 315
9 5 使用ssis更新cube 316
9 6 预先缓存 319
9 6 1 数据存储选项 319
9 6 2 缓存模式 320
9 7 使用中间数据库 323
9 8 小结 324
第10章 基础和运维 325
10 1 插桩 325
10 2 容量规划 329
10 3 磁盘子系统 330
10 3 1 随机每秒钟i/o次数与顺序每秒钟i/o次数 330
10 3 2 ntfs碎片 331
10 3 3 磁盘分区设计 333
10 3 4 raid选项 334
10 3 5 存储阵列网络 336
10 3 6 控制器缓存 337
10 3 7 固态磁盘 337
10 4 网络设计 338
10 4 1 巨型帧 338
10 4 2 链接集成 339
10 5 防火墙和路由器 340
10 5 1 windows防火墙和防病毒软件 341
10 5 2 使用路由器作为硬件防火墙的替代方案 341
10 6 负载均衡器 341
10 7 dns 342
10 8 临时环境 343
10 9 部署 343
10 9 1 数据层升级 344
10 9 2 提高部署速度 344
10 9 3 页面编译 345
10 9 4 预热缓存 345
10 10 服务器监控 346
10 11 小结 347
第11章 综合起来 348
11 1 从何处入手 348
11 2 开发过程 349
11 2 1 组织 350
11 2 2 项目阶段和里程碑 350
11 2 3 编码 351
11 2 4 测试 351
11 2 5 bug跟踪 351
11 2 6 用户反馈 352
11 2 7 高性能的技巧 352
11 3 league 354
11 4 工具 355
11 5 架构 356
11 6 备忘录 357
11 6 1 原则和方法（第1章） 357
11 6 2 客户端性能（第2章） 357
11 6 3 缓存（第3章） 359
11 6 4 iis 7（第4章） 360
11 6 5 asp net线程和会话（第5章） 361
11 6 6 使用asp net实现并管理优化技术（第6章） 361
11 6 7 管理asp net应用策略（第7章） 362
11 6 8 sql server关系数据库（第8章） 363
11 6 9 sql server分析服务（第9章） 364
11 6 10 基础设施和运维（第10章） 364
11 7 小结 365
词汇表 367
译者序
长期以来，在 NET Web开发领域一直缺少一本用来讲解性能优化的书籍，大多数 NET Web开发书籍都将大量笔墨倾注在控件使用、控件开发以及数据源操作上。当性能出现问题时，有的 NET Web开发人员要么束手无策，因为这些控件对于他们来说就像一个黑盒；要么去求助其他平台的Web性能优化书籍，但这些书籍往往没有针对 NET的特殊处理，优化效果也大打折扣。
现在， NET Web开发人员终于迎来了这么一本属于我们自己的Web性能优化手册。这本亚马逊五星级图书，本着压榨每一个字节的态度从Web前端优化、缓存、服务器到数据库后端各个方面给 NET Web性能优化提供端到端的指导。书中包含许多真实的代码，大部分都可以在自己的项目中直接使用，有些优化只需要花费少量的时间，就可以收到立竿见影的回报。
本书分为11章，第1章是原则和方法，给全书定下了一个基调：我们要压榨Web开发中每个字节。第2章讨论客户端性能，包括网络连接、CSS以及JavaScript等资源的优化。第3章是本书的重头戏——缓存，缓存在Web性能中可谓是一哥，这章按照缓存离用户的远近顺序做了全面的介绍。做ASP NET肯定离不开IIS，第4章以IIS 7为例，对IIS调优进行了讲解，原来IIS不是配一下网站就万事大吉了。第5章介绍了线程与会话，对于构建可扩展的Web架构尤为重要。第6章从ASP NET特有的特性来讲解其对优化的作用，比如母版页，比如针对特定浏览器生成输出等。第7章介绍了HttpHandler和HttpModule等方面的内容，对于习惯拖控件构建Web页面的开发人员，这一章会让你看到ASP NET的另一个世界。第8章、第9章介绍了SQL Server的优化，从缓存、索引等方面做了详细的介绍，第8章也是本书篇幅最大的一章。第10章从运维的角度来讨论优化。第11章是集成，将前10章所有的东西结合在一起使用。
本书的翻译和编辑工作差不多贯穿了2010年整整一年，其中因为工作变动对交付进度造成很大的影响，在这里要特别感谢图灵公司的编辑的体谅和支持。感谢好友王雄对部分章节的审阅。
最后，要感谢我的女友照云，非常感谢你这几个月的陪伴，对我因赶进度对你的冷落毫无怨言，甚至还自告奋勇帮忙审稿。
前言
我在微软的工作经历给我的人生带来了意想不到的巨大转变。到微软之前，我所在的公司都是微软的竞争对手，时不时会听到反微软的言论和宣传。但是，当我听说 NET后，我就知道应该了解更多，而最好的方式就是到它的发源地去学习。
在进入微软公司深入了解这些技术之后，我被眼前的一切震撼了。 NET Framework、C#语言、ASP NET以及SQL Server都非常先进，都有非常漂亮的技术架构。在使用Java（无疑也是非常优雅的语言）数年后，我可以使用一个集成良好的平台，将（几乎）所有东西无缝地集成在一起工作，确实令人精神振奋，干劲倍增。从技术层面上讲，我很认同平台开发人员的决策和权衡，而且最终的系统也能相当大地提高开发人员的效率。微软的工程团队也人才济济，极具创新意识，而给我这个曾经圈外人带来的最大惊奇是，他们打心眼儿里想要解决客户的问题。
我对技术的热衷让我成了直面客户的人——担任位于硅谷的微软技术中心的解决方案架构师。直面深层次的客户问题是另一项令人大开眼界的经历。首先，我可以在许多人或公司那里体会到微软技术产生的积极影响。其次，我还能感受到有些人面对很差劲的结果时的强烈挫败感。这本书，在某种程度上就是为减少挫败感而写的。
我的观点是ASP NET和SQL Server很有潜力。但是，这些技术的关键点还未被很多开发人员认识到。我曾经与许多想要挖掘这种潜力，但却苦于不得其门的开发人员和经理交谈过。可是，认识到该技术全部的潜力必须投入更多努力；其中的特性丰富多彩，但要完全领略其风采必须有正确的视角。本书的一个目的就是赶走遮住技术美景的层层迷雾，让你亲眼目睹ASP NET和SQL Server的美丽。
写这本书的另一个原因是我常被一些很慢的网站所折磨，希望本书介绍的内容能帮你改变这个现状。在Web的世界里一切皆有可能，未来的Web一定会超过现在的水平——但良好的性能是实现它们的基础。到那时谁也不会再遇到缓慢的网站。
我现在使用的是高于3 Mb/s的DSL连接到Internet，我的台式机4个CPU内核都工作在3GHz，与过去几年相比是出奇得快。即使这样的连网速度和处理能力，加载许多网站仍然要花很长时间，有时甚至加载一个页面都要好几分钟，而此时我的本地网络和CPU几乎是空闲的。作为软件专业人员，我们应该关注这种问题，因为出现这种问题实在太丢人了。我不仅要自己做得更好，更想让我的职业为人称道。为此，我们开发的网站就不仅要快，还要超快！
读者对象
本书的前两章和最后两章提供的信息几乎对所有Web开发人员都有用，且与使用的底层技术无关。中间7章是为使用ASP NET和SQL Server设计、构建或维护网站的中高级的架构师和开发人员写的。刚刚从Java或PHP转到 NET的有经验的Web开发人员也会从本书找到很多有价值的信息。
《构建高性能可扩展ASP NET网站》也非常适合那些不是开发人员，但对优化网站技术感兴趣的读者。尤其是对参与网站运维、测试或管理的相关人员，这本书给出了许多开发团队应该重视的原则和问题，并提供了示例帮助理解。
联系作者
可以通过rick@12titans net联系到我，也欢迎访问我的网站
我非常想听到你关于高性能方法的经验。
提高性能和可扩展性的技术会随着底层技术的变迁不断地发展。我非常想听到你发现很有效，但本书却没有涉及的技术。
欢迎指出正文或代码示例中的错误，也欢迎各种改进本书的建议。
致谢
我要感谢Apress优秀的团队：Ewan Buckingham早期给了我大力支持和鼓励；Matthew Moodie对全书的结构和流程提供了帮助；Simon Taylor负责了技术审校，还复查了代码示例；Anita Castro负责项目管理，Kim Wimpsett和Tiffany Taylor帮我润色了本书的文字。
我还要感谢Phil de Joux的反馈意见。
媒体评论
“作者写作本书的目标之一就是揭开技术迷雾，欣赏ASP NET和SQL Server的天作之合，并挖掘它们的全部潜力，他真的做到了这一点。”
——亚马逊读者评论
“我用ASP NET很多年了，我知道如何使用AJAX构建健壮的Web，如何使用角色控制等，但就是不知道如何用ASP NET把网站变得速度更快。这本书弥补了我这方面知识的空白。”
——Frank Stepanski，ASP NET、AJAX程序员