简介这是一套面向高校计算机专业学生的《ASP.NET Web 程序设计》第二版配套教学课件适用于课堂教学、期末复习与自学入门帮助读者系统建立从 Web 基础到 ASP.NET 开发的完整知识框架。压缩包内共 1 个文件为 PPT 格式电子讲义体积约 4.2MB以章节幻灯片的形式呈现整本书的教学内容方便直接投屏授课或按章翻阅。课件围绕 HTTP 协议请求与响应流程、Web 服务器与 B/S 体系结构、静态网页与动态网页的差异、基于 Web 的三层数据库应用等基础内容展开并重点对比 ASP 与 ASP.NET 在效率、可重用性和代码量上的区别讲解 .NET 框架的组成、MS 中间语言、CLR 公共语言运行库与 .NET 类库的作用还涉及 ASP.NET 程序基本结构、设计目标与开发步骤。目前已有 181 人学习适合零基础入门者梳理概念脉络也适合作为教师备课与课堂讲授的现成素材。1. 从一套 PPT 电子课件反推 ASP.NET 的知识地图《ASP.NET Web 程序设计》第二版的全套电子课件表面上看就是一堆按章切好的 .ppt翻进去才会发现它把 Web 的底层链路铺得比很多新教材都完整HTTP 请求怎么发出去、Web 服务器怎么响应、静态页和 .aspx 动态页在服务器端分别发生什么、ASP 的解释执行和 ASP.NET 的编译执行差在哪、IIS 装完之后默认站点落在哪个目录。这些恰好是现在被跳过的部分——很多人直接上手 ASP.NET MVC 或 ASP.NET Core 写 Controller却说不清一次请求从浏览器到数据库再回来中间经过了哪几层。这份课件的适用场景其实很具体高校课程的备课与期末复习、计算机专业复试里的 Web 基础问答、以及维护早期 ASP.NET Web Forms 企业级 Web 项目时需要补的背景知识。下面几章按课件本身的推进顺序拆每个知识点都配一条能自己动手验证的命令或代码PPT 上给出的结论自己在机器上跑一遍再确认。2. HTTP 报文与 B/S 三层结构课件里最容易囫囵吞枣的一节2.1 一次 HTTP 请求响应到底交换了什么课件把 HTTP 说成浏览器向 Web 服务器发出的搜索某个网页的请求这个描述方便入门但动手时会发现请求行里装的远不止路径。常见做法是先用一个能打印完整报文的客户端把请求拆开看把浏览器替你做的隐式动作显式地写出来。# -v 打印完整的请求行/请求头前缀 与响应行/响应头前缀 curl -v -X GET http://localhost/Default.aspx \ -H Host: localhost \ -H User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) \ -H Accept: text/html,application/xhtmlxml \ -H Cookie: ASP.NET_SessionIdabc123-X GET指定请求方法-H逐条追加请求头-v让 curl 不做静默处理。输出里要盯四样东西响应状态行200 还是 404、500、Content-Type是不是text/html; charsetutf-8、Content-Length返回体字节数、以及Set-Cookie里有没有ASP.NET_SessionId。最后这一项是判断这个页面是否在服务器端执行的最直接证据——纯静态 HTML 不会给你发会话 Cookie。提示把Host头改成另一个域名再请求同一台服务器能直观看到 IIS 是按 Host 头做站点绑定的这也是同一台机器跑多个 Web 项目的原理。2.2 静态页与动态页的判定先看服务器行为再看扩展名课件区分静态网页和动态网页用的是扩展名这没错但不够。静态页的 .html/.htm 代码是设计完成后原样从磁盘读出来发出的无论谁访问、什么时候访问、以什么方式进入返回的字节都一样动态页的 .asp/.aspx 必须先由服务器端执行程序再把执行结果拼成 HTML 发回浏览器。对比项静态页.html/.htm动态页.asp/.aspx代码存放位置服务器磁盘原样保存服务器端程序可能被编译是否在服务端执行否是返回内容文件本身的字节程序执行结果生成的 HTML同一 URL 多次访问内容恒定可随会话、参数、时间变化常见服务器端技术无CGI、PHP、ASP、JSP、ASP.NET验证方法不需要写代码用两次带不同查询字符串的请求做 diff 就够# 请求同一个动态页面的两个不同参数比较返回体 curl -s http://localhost/Show.aspx?id1 a.html curl -s http://localhost/Show.aspx?id2 b.html diff a.html b.html-s关闭进度条把返回体重定向到文件。如果diff输出为空说明这个页面要么是静态的要么服务端代码根本没读Request.QueryString[id]——后者是初学者最常见的漏写。反过来如果两次输出有差异就说明页面确实在服务器端被执行过这比看扩展名可靠得多。2.3 三层 B/S 结构与数据回传路径课件提到的Browser/Server/Database Server三层结构落到代码上就是三段职责分明的链路浏览器负责输入输出Web 服务器负责接收处理数据库服务器负责存取。把这三层和具体实现对应起来比背概念有用层次课件中的角色常见实现第一层 浏览器用户在表单中输入数据并提交HTML 表单、JavaScript、POST 请求第二层 Web 服务器接收并处理数据从数据库查询或录入IIS ASP.NET 应用程序第三层 数据库服务器存储数据、响应查询SQL Server、MySQL 等第二层的典型写法是参数化查询而不是拼接 SQL 字符串// 位于 Web 服务器上的数据访问代码连接串统一放在 Web.config 里 string connStr ConfigurationManager.ConnectionStrings[AppDb].ConnectionString; using (var conn new SqlConnection(connStr)) using (var cmd new SqlCommand(SELECT Name FROM Users WHERE Id id, conn)) { // id 是占位符由 ADO.NET 负责转义避免字符串拼接带来的注入问题 cmd.Parameters.Add(id, SqlDbType.Int).Value id; conn.Open(); object name cmd.ExecuteScalar(); // 返回结果集首行首列 }SqlDbType.Int显式声明参数类型让数据库能复用执行计划using保证连接和命令对象在异常时也能释放ExecuteScalar适合只取一个值的场景。把这些拆开看就能理解课件为什么强调三层结构——浏览器、Web 服务器、数据库服务器各自只做自己那一段任何一层出问题都能单独定位。3. ASP 与 ASP.NET 的执行模型差异解释、MSIL 与 JIT3.1 两条完全不同的执行路径课件用效率两个字概括了 ASP 和 ASP.NET 的差别展开看是两条执行路径。ASP 是脚本编程环境只能用 VBScript 或 JavaScript 这类非模块化语言写每次请求都由脚本引擎逐行解释解释一行执行一行。ASP.NET 建在 .NET Framework 之上页面在第一次被请求时整体编译成中间语言之后再执行的是已经优化过的产物不需要重新走一遍解析。这个差异带来的实际感受是ASP.NET 站点的第一次访问会明显偏慢随后的请求速度抬升。很多人在本地调试时觉得刚启动卡一下就是这个编译过程在消耗时间。3.2 MSIL、CLR 与 JIT一段代码的两次编译课件里 MS 中间语言、CLR、JIT 是分开讲的实际它们是同一条流水线上的三个环节。用命令行工具可以把这条流水线切开看# 在 Visual Studio 开发者命令提示符下运行先编出程序集 csc /target:library /out:Demo.dll Demo.cs # 导出程序集里的中间语言文本肉眼确认 IL 长什么样 ildasm Demo.dll /out:Demo.il/target:library生成类库而不是可执行程序/out:Demo.dll指定输出文件名ildasm是随 .NET SDK 提供的反汇编工具/out:Demo.il把 IL 写成文本文件。打开 Demo.il 会看到ldstr、call、ret这类指令——它们不是任何 CPU 能直接执行的机器码可读性差但已经做过一轮优化。真正把它变成机器码发生在运行时CLR 调用 JIT 编译器把 IL 翻译成本机代码并做最后的、与当前机器匹配的优化。CLR 同时承担内存管理、垃圾回收和安全性等核心服务它才是 .NET Framework 的地基。部件职责MSIL高级语言编译后的中间语言不能直接执行经过优化CLR执行 IL提供内存管理、垃圾回收、安全等核心服务JIT运行时把 IL 编译为本机代码并做本地优化.NET 类库大量可直接调用的功能库降低复杂功能的实现难度.NET 语言VB.NET、C#、JScript.NET 等可编译为 IL 的语言3.3 CodeBehind代码与内容分离怎么落地课件把可重用性归为 ASP.NET 相对 ASP 的核心优势落到文件结构上就是 CodeBehind。ASP 时代 ASP 代码和 HTML 混在一个文件里任意位置都能插一段逻辑表面上方便实际产生大量难读的页面ASP.NET 把逻辑抽到后台文件页面只剩标记% Page LanguageC# AutoEventWireuptrue CodeBehindDefault.aspx.cs InheritsDemo.Default % htmlbody form idform1 runatserver asp:Label IDlblMsg runatserver / asp:Button IDbtnOk runatserver Text提交 OnClickbtnOk_Click / /form /body/html// Default.aspx.cs —— 只放逻辑页面标记不与它混写 public partial class Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnOk_Click(object sender, EventArgs e) { lblMsg.Text 当前时间 DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss); } }CodeBehind指向后台文件名Inherits指向编译后的类全名两者必须对应否则页面运行时会抛解析错误。partial声明分部类把设计器生成的控件字段声明和手写的逻辑合成一个类。OnClickbtnOk_Click是事件绑定方法签名必须保持(object sender, EventArgs e)。这套机制就是课件所说代码和内容的完全分离也是后面维护老项目时最先要看懂的东西。3.4 三个维度的对比结论维度ASPASP.NET语言VBScript、JScript 等非模块化语言VB.NET、C#、JScript.NET 等模块化语言执行方式逐行解释首次编译为 ILJIT 后本机执行代码组织与 HTML 混合include 只能有限模块化代码与内容分离CodeBehind代码量功能基本都要手写常用功能由框架承担代码量明显减少调试缺少强工具支持编译期检查、断点调试配置方式多数靠改代码以 Web.config 配置为主课件还列了 ASP.NET 的设计目标去除对脚本引擎的依赖、减少开发 Web 应用所需的代码量、允许扩展或替代内置功能、用简单配置完成部署、已有的 ASP 代码经较小修改后可复用、提供强调试工具、语言之间不设能力差异、提供 Windows Authentication / Forms Authentication / Microsoft Passport 三种身份确认模型、不要求额外的开发工具、并且尽可能容忍错误。这几条里配置部署和身份确认模型在后面的 IIS 章节会直接用到。4. IIS 站点部署实战绑定、应用程序池与 Web.config4.1 安装 IIS 与默认站点目录课件按 Windows XP 的路径写安装步骤插入安装光盘打开控制面板的添加/删除程序点击左侧添加/删除 Windows 组件在向导里勾选Internet 信息服务IIS完成后系统自动在系统盘建立网站目录默认是C:\Inetpub\wwwroot。这套路径在今天的系统上已经不适用等效操作是用命令行开启对应功能# Windows 10/11 与 Windows Server 上启用 IIS 及 ASP.NET 4.x 支持 Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServerRole, IIS-WebServer, IIS-ASPNET45 -AllIIS-WebServerRole是总开关IIS-WebServer装上静态文件与默认文档处理能力IIS-ASPNET45负责把 ASP.NET 4.x 的 ISAPI 处理程序注册进 IIS。少装最后一个.aspx 页面会直接报 404.3。装完确认一下站点状态和默认文档Get-Website | Select-Object Name, State, PhysicalPath Get-WebConfigurationProperty -Filter system.webServer/defaultDocument -Name files第一条列出站点名、运行状态和物理路径用来核对默认站点是否指向C:\Inetpub\wwwroot第二条列出默认文档列表确认Default.aspx已在其中否则访问根路径只会看到目录列表或 403.14。4.2 站点绑定、应用程序池与 CLR 版本课件只讲到展开目录树就能看到默认网站实际部署新项目时多站点共用一台服务器才是常态靠端口或主机名区分。核心概念是应用程序池——每个池是一个独立的 w3wp.exe 进程站点跑在哪个池里决定了它用哪个 .NET 版本、以及某个站点崩溃时会不会连带其他站点。配置项取值示例说明绑定类型http也可以用 https需要先绑证书端口8080与已有站点错开避免端口冲突主机名demo.local留空则按端口区分应用程序池DemoPool独立进程隔离故障托管管道模式集成 / 经典老项目常需切换为经典.NET CLR 版本v4.0与项目目标框架一致# 新建应用程序池并指定运行时版本 New-WebAppPool -Name DemoPool Set-ItemProperty IIS:\AppPools\DemoPool -Name managedRuntimeVersion -Value v4.0 # 创建站点绑定 8080 端口指向项目物理目录 New-Website -Name DemoSite -Port 8080 -PhysicalPath C:\Inetpub\wwwroot\Demo -ApplicationPool DemoPoolmanagedRuntimeVersion设成v4.0表示这个池只加载 .NET 4.x 运行时写成别的值比如空值会走无托管代码模式.aspx 请求找不到处理程序。-PhysicalPath必须是站点根目录指向 bin 目录会直接 500。4.3 Web.config 里必须先认识的几个节点配置集中在 Web.config这是 ASP.NET 相对 ASP 最省事的地方——改配置不改代码。下面几个节点是每个项目都会碰到的configuration connectionStrings add nameAppDb connectionStringData Source.;Initial CatalogDemo;Integrated SecurityTrue providerNameSystem.Data.SqlClient / /connectionStrings system.web !-- 上线必须关闭 debug否则编译不优化、异常细节外泄 -- compilation debugfalse targetFramework4.8 / !-- 对应课件提到的身份确认模型之一Forms 认证 -- authentication modeForms forms loginUrl~/Login.aspx timeout30 / /authentication !-- 控制 ViewState 的完整性与加密 -- pages enableViewStateMactrue viewStateEncryptionModeAlways / /system.web /configurationconnectionStrings把连接串从代码里挪出来换环境只改配置debugfalse是上线前的必查项authentication mode对应课件列出的身份确认模型Forms是自定义登录页最常见的选择loginUrl指向未登录时的跳转页timeout单位是分钟。enableViewStateMac与viewStateEncryptionMode控制 ViewState 的完整性校验与加密如果项目从很老的模板继承下来这两项可能被显式关掉务必改回来。4.4 上线后最常见的几类报错状态码/现象常见原因处理方向403.14目录浏览被禁且无默认文档补默认文档或开启目录浏览404.3未注册 .aspx 处理程序安装 IIS-ASPNET45 或重新注册 ASP.NET500.19Web.config 节点被锁定或 XML 格式错误检查节点是否允许覆盖、XML 是否闭合500.21应用程序池未安装对应 .NET 版本调整 managedRuntimeVersion500.24托管管道模式与认证方式冲突临时切换为经典模式验证页面能开但样式全丢静态文件处理程序未启用确认 StaticFileModule 已安装处理顺序建议从 500.19 开始排查因为配置文件读不进去时IIS 根本不会执行你的代码后面所有报错都可能是假象。5. 把课件当学习路线用页面生命周期与 ViewState 的两个验证技巧课件讲到 ASP.NET 程序基本结构时列了页面、用户控件、服务器控件、应用程序对象但没展开页面生命周期这恰恰是后面所有控件事件能正常工作的前提。事件触发顺序大致是 PreInit、Init、InitComplete、PreLoad、Load、控件事件如按钮 Click、PreRender、SaveStateComplete、Render、Unload。ViewState 在 SaveStateComplete 之后、Render 之前被序列化进页面的隐藏字段所以它记录的是渲染前的最终状态这是理解回发机制的钥匙。有两个成本极低的验证动作做过一次就很难忘。第一看 ViewState 到底占了多少字节# 取回页面抓出 __VIEWSTATE 隐藏字段的原始内容 curl -s -c cookie.txt http://localhost:8080/Default.aspx \ | grep -o __VIEWSTATE[^]* | head -1 | wc -c-c cookie.txt保存会话 Cookie保证下次请求在同一会话中grep -o只输出匹配到的片段wc -c数字节数。把某个只读的 GridView 上加上EnableViewStatefalse重新请求同一页两个字节数的差值就是 ViewState 的真实成本。数据量大的列表页里这个数字经常大到让人改变设计。第二确认 ViewState 的完整性校验和加密确实是开着的。除了前面 Web.config 里的enableViewStateMac与viewStateEncryptionMode还要注意machineKey多台服务器做负载均衡时各机器的自动生成密钥不一致会导致 ViewState 校验失败表现为随机的验证视图状态 MAC 失败。这类问题在老项目扩容时非常典型解决方式是在所有节点统一显式配置machineKey而不是关掉校验。课件的讲义部分适合建立概念框架PPT 的章节顺序则基本对应了一条可以照做的学习路线先看 HTTP 与 B/S 结构再理解编译模型然后装 IIS 把示例页跑起来最后用页面生命周期把零散的控件知识串起来。每一章都动手验证一次比把 PPT 从头背到尾更接近这门课真实想教的东西。本文还有配套的精品资源点击获取
