回复 Scott Henselman 的面试问题






3.11/5 (15投票s)
这是我非常谦逊的努力,怀着对 Scott Henselman 先生的极大敬意,回答他的面试问题。
我们来回答 Scott Hanselman 的面试问题。
首先,我想澄清,这篇文章的目的仅仅是教育/分享知识。也许我错了,如果你们中的任何人通过评论这篇文章并提供可靠的参考文献来纠正我,我将不胜感激。我将非常感谢贡献者。
许多天前,我看到了 Scott Hanselman 的网站,并一直在阅读他的许多其他博客,我发现了一系列他常问的面试问题,他认为不同水平的 .NET 开发人员都应该知道这些问题。我收集了许多(有些也写了答案)面试问题,并将它们放在一个平台上,仅用于知识共享 @ http://interviewquestion.wordpress.com。实际上,我一直喜欢参与面试问题,所以我决定根据我微薄的知识来写下它们的答案。
我现在可以说,当我思考/撰写它们的答案时,这真是一次很棒的学习/评估经历,因为仅仅浏览它们与回答它们是两回事。
嗯,现在让我告诉你,我没有100%回答,也没有100%知道答案,所以我只是告诉你我用我的大脑回答了多少,以及我没能回答多少。我把答案分成了三类。1 我知道 J。2 我不知道 L。3 我知道但不敢肯定 ;) 所以要么寻求帮助,要么根据我微薄的知识来写。
在每个问题的末尾,我都提到了表情符号,以表明我知道哪个……如果你有兴趣知道我是否知道,它会帮助你,而不是在MSN上ping我 :D
让我为我的知识与问题做个统计 :P
总问题数:84
我知道:61 (如果我没数错的话) :)
我知道但不确定:16 (所以结合大脑和外部帮助回答了) ;)
我不知道:7 :(
优秀的.NET开发人员应该知道什么
所有编写代码的人
- 描述线程和进程的区别?:)
- 线程是处理器执行的最小单位。线程的集合构成进程。通过将进程划分为线程,处理器实现了多任务处理(通过并发而不是并行运行线程)。线程可以共享内存,但进程不能共享内存。同一进程的线程可以在没有任何中间层的情况下相互通信,但进程不行,它们需要进程间通信之类的东西。
- 什么是 Windows 服务?它的生命周期与“标准”EXE 有何不同?;)
- Windows 服务是基于 Windows 的后台进程,它没有用户界面,就像其他服务一样(在 UNIX 环境中称为守护进程)。Windows 服务在执行前需要安装,这与 EXE 不同。Windows 服务用于执行不需要用户交互但基于系统状态事件的任务,例如在特定时间间隔或系统处于不同状态时执行任务,例如在磁盘即将满时提醒用户清理。Windows 服务由服务控制管理器 (SCM) 控制,即使用户未登录其 Windows 帐户也会自动启动(因为 SCM 已经有帐户凭据,所以 SCM 知道系统启动时哪些服务需要启动以及使用哪个帐户),而 EXE 由操作系统控制,只有当用户使用 Windows 帐户登录时才会运行。
- Windows 上任何单个进程可以寻址的最大内存量是多少?这与系统的最大虚拟内存不同吗?这将如何影响系统设计?;)
- Windows 上的单个进程可以寻址的内存量不同,因为它取决于系统(32 位/64 位处理器)和操作系统。是的,进程内存消耗大小可能与最大虚拟内存大小不同。如果软件/进程代码是为 64 位处理器编写的(因为 64 位处理器支持两倍以上的内存),那么它将无法在 32 位系统上运行该进程。
- EXE 和 DLL 有什么区别?:)
- EXE 是可执行的独立程序/进程,它有自己的保留内存空间,而 DLL(动态链接库)既不可执行也不独立,它被其他 DLL/程序使用。
- 什么是强类型与弱类型?哪种更受青睐?为什么?:)
- 强类型是指打字技能很好的人,而且可以聊很多天 :D 开个玩笑。强类型是指在代码编译时,类型规则严格按照分配给它们的数据执行,而弱类型与此定义完全相反。JavaScript/C/C++ 是弱类型,而 .NET 语言是强类型。强类型在运行时错误风险更小,并且在程序执行期间效率更高,但编译时则不然。
- Corillian 的产品是“组件容器”。列举至少 3 个 Windows Server 系列现在附带的组件容器。;)
- 我不确定我是否正确理解了这个问题。我认为答案是 Windows Shell、Windows Explorer、IIS (随意猜测)
- 什么是 PID?在排查系统故障时它有什么用?:)
- PID 是进程 ID,它在系统中是唯一标识任何进程的。在排查故障时,我们可以通过 PID 终止进程。
- 一个 TCP/IP 端口可以有多少个进程监听?:)
- 我认为单个进程一次只能持有任何端口的句柄,这意味着只能在一个端口上监听。有一次我运行我的 Web 应用程序时出现了错误,因为另一个应用程序 (Skype) 正在使用该端口。这也说得通,端口就像门一样,如果两个人在一个特定的门上交谈,第三个人过来,那就没有隐私了 :-D (离婚率会急剧上升)
- GAC 是什么?它解决了什么问题?:)
- GAC 代表全局程序集缓存,用于存储可共享/公共程序集 (DLL),供多个程序使用。它为程序提供了一个共享平台来使用单个程序集,并且可以存储不同版本的相同程序集(同名),有助于解决 DLL HELL 问题。
中级 .NET 开发人员
· 描述接口导向编程、面向对象编程和面向方面编程之间的区别。;)
???????????? 如果您知道答案,请通过评论回复并附上参考文献。
· 描述什么是接口以及它与类的区别。 :)
· 接口严格来说是一个没有实现的契约,这意味着接口只能声明属性或方法。类可以有其方法的实现,可以有不同级别的访问修饰符,而接口的属性或方法只能有公共访问修饰符,并且可以实现类和多个接口。
· 什么是反射? :)
· 反射是一种在运行时动态加载程序集,并使用程序集元数据访问其命名空间、类及其属性、方法甚至事件的机制。
· 使用 ASMX 的 XML Web 服务和使用 SOAP 的 .NET Remoting 有什么区别? :(
· Remoting 假设另一端是 .NET。这是因为 .NET Remoting 使用 SOAP 时会使用 SoapFormatter 来序列化数据。SoapFormatter 将反序列化对象所需的类型信息嵌入到消息本身中。这要求客户端和服务器都必须能够访问此程序集。Remoting 相信 .NET 类型系统。Remoting 相信共享类型和程序集。Remoting 可以支持 DCOM 样式的客户端激活对象(Client Activated Objects),这些对象是有状态的。但是,CAOs 的使用必须仔细考虑,因为 CAOs 不能进行负载均衡。ASMX 模型不假设另一端是 .NET。ASMX 使用 XmlSerializer 来序列化数据。XmlSerializer 认为 XML 类型系统,即 XSD 是优越的,并且致力于序列化符合模式的数据。换句话说,XML Web 服务相信共享模式和契约胜过类型和程序集。这使得 Web 服务具有互操作性。ASMX 服务通常是无状态的。参考
· XmlSchema 和 CLS 表示的类型系统是否同构? :(
· 不,存在一些阻抗不匹配。这就是为什么你需要 IXmlSerializable 来帮助 XmlSerializer。XSD 从传统意义上讲不是一个类型系统。参考
· 从概念上讲,早期绑定和晚期绑定有什么区别?:)
· 早期绑定意味着编译器在代码编译期间获取类型调用/路径执行的信息,而在晚期绑定中,编译器不会获取该信息,这些信息是在运行时/执行时确定的。
· 使用 Assembly.Load 是静态引用还是动态引用?:)
· 它是动态加载 (反射)
· 何时适合使用 Assembly.LoadFrom 或 Assembly.LoadFile?;)
· 区别只在于绑定。LoadFrom 更加灵活,如果它找不到指向的程序集,它可以重定向到另一个路径;而 LoadFile 严格指向/依赖于定义的程序集引用/路径,失败时不会重定向。
· 什么是完全限定程序集名称(Asssembly Qualified Name)?它是一个文件名吗?它有什么不同?:)
· 程序集限定名包含程序集名称、版本、令牌密钥,而文件名是物理文件系统上的简单文件名。程序集名称作为元数据存储,在定义范围方面非常重要。
· 这个是有效的吗? Assembly.Load("foo.dll") :)
· 当然不是 :D 因为它是一个文件名,而不是所需的程序集限定名。
· 强命名程序集与非强命名程序集有何不同?:)
· 强命名程序集由于具有公共令牌密钥而具有强名称,因此可以存储在 GAC(共享环境)中并可由多个程序引用,而非强命名程序集无法存储在 GAC 中。
· DateTime 可以为 null 吗?:)
· 在 .NET 2.0 之前是不可能的,因为 datetime/integer... 是结构体/值类型,不能为 null,但由于可空类型,现在是可能的。
· JIT 是什么?NGEN 是什么?它们各自的局限性和优点是什么?J;)
· 我记得,有一次我在一家大公司面试时,面试官问我关于 .NET IL 编译的问题……我开始讲述,也谈到了 JIT。听完之后他说,嗯,JIT 存在于 Java 技术中,而不是 .NET 技术中。我说不,我读过它,它确实存在,但他一直否认我,所以我安静了下来,说好吧。无论如何,JIT 代表即时编译器,它通过三种不同的技术将代码编译成本机代码以供处理器执行。它在代码需要运行之前进行编译,这使得执行速度有点慢(取决于情况),所以为了避免这种情况,我们使用 NGEN,它像 JIT 一样将 IL 转换为本机代码,但发生在部署期间。它附带了一个大镜像,其中也包含不经常调用的代码的编译版本。
· .NET CLR 中的分代垃圾回收器如何管理对象的生命周期?什么是非确定性终结?;)
· 对象生命周期分为三个不同的代,1个短期和2个长期,因此相应地进行管理。非确定性终结意味着垃圾回收器不是在对象超出范围后立即调用对象的终结方法,而是在垃圾回收器有空闲时间时优先处理它。
· Finalize() 和 Dispose() 有什么区别?:)
· Finalize 由 GC 调用,Dispose 由程序员调用以释放资源。
· using() 模式有什么用?什么是 IDisposable?它如何支持确定性终结?:)
· using 语句非常方便,并使代码非常高效,因为在 using 语句结束之后,在该语句中创建/声明的对象会自动释放,这意味着 dispose 方法以确定性的方式被调用以释放内存。IDisposable 是类实现的接口,以确定性的方式释放非托管资源。
· 这个有用的命令行做了什么?tasklist /m "mscor*" ;)
· 它将列出所有已加载以 mscor… 开头的模块(由 .NET 环境托管)的进程。
· 进程内(in-proc)和进程外(out-of-proc)有什么区别?:)
· 顾名思义,in-proc 意味着在调用者/主机的相同进程内存域中加载,这是一种快速技术,但在发生任何故障/异常时不如 out-of-proc 可靠。out-of-proc 与 in-proc 定义相反,由于在主机进程之外加载,因此不依赖于主机进程,并且在主机进程因某种原因失败时可能是安全的。
· 什么技术支持 .NET 中的进程外通信?;)
· 通过封送处理的 .NET Remoting
· 在 ASP.NET 中运行组件时,它在 Windows XP 上运行在哪个进程中?Windows 2000 上呢?Windows 2003 上呢?J
· 在 Windows XP 和 Windows 2000 中是 Aspnet_wp.exe,但在 Windows 2003 中是 w3pw.exe。
高级开发人员/架构师
· 像这样的代码行有什么问题?DateTime.Parse(myString); :)
· 不一定有什么问题,但可能会出错,即没有错误没有异常,但由于缺少区域/文化信息,可能会产生一些逻辑错误,例如意外的结果。
· 什么是 PDB?它们必须位于何处才能使调试正常工作?:)
· PDB 代表程序数据库,用于存储调试符号和元信息以进行调试。通常它们位于 bin 或 debug 文件夹中。
· 什么是圈复杂度?为什么它很重要?:(
???????????? 如果您知道答案,请通过评论回复并附上参考文献。
· 编写一个标准的 lock() 加“双重检查”来围绕变量访问创建关键代码段。:);)
· Object objLock; bool isLocked = true; if (isLocked) {lock(objLock){if (isLocked) {//bingooooo}}}}
· 什么是完全信任 (FullTrust)?GAC 中的程序集是否具有完全信任?:)
· FullTrust 意味着新婚燕尔 :D 在 .NET 中,它意味着程序集对系统资源拥有完全访问权限(这非常危险,在共享主机域中只允许中等信任级别)。是的,GAC 中的程序集具有完全信任。
· 如果您的代码使用要求特定安全权限的属性进行修饰,您的代码会获得什么好处?:)
· 它让用户知道您的代码/程序需要做什么,以及是否允许它执行操作,因此它在安全权限方面变得用户友好。
· 这个命令做了什么?gacutil /l | find /i "Corillian" :)
· 我只知道 gacutil,不知道其他参数,但我认为我可以猜测,所以 gacutil /l 意味着 GAC 中程序集的列表(因为 gacutil 用于在 gac 中安装/卸载程序集,我只做过这个操作)find /I “Corrilian” 似乎是查找名为 Corillian 的程序集,不确定 /I,但我认为在其他命令中它意味着忽略大小写,希望在这里也一样 ;)
· 这个命令做了什么?sn -t foo.dll :)
· SN 代表强名称,用于生成程序集的强名称,但此处不确定 –t 参数,但我搜索后得知它是用于令牌密钥。
· DCOM 跨防火墙需要打开哪些端口?端口 135 的用途是什么?:(
· DCOM 是一种分布式 COM 技术,用于远程过程调用,默认使用端口 135。135 是远程过程调用服务的端口,由于 DCOM 是基于 OO 的 RPC 机制,所以毫不奇怪 ;) 顺便说一句,好问题能难倒所有人 J
· 比较 OOP 和 SOA。它们各自的原则是什么?:)
· OOP 的原则是多态、继承、抽象……而 SOA 的原则(不太确定)是基于服务的,因此包括发现/访问、互操作性、安全性、可分发性
· XmlSerializer 如何工作?使用它的进程需要哪些 ACL 权限? :(
· XmlSerializer 分别使用读/写接口来反序列化/序列化基于 XML 的数据,因此可以理解它使用了反射。
· 为什么 catch(Exception) 几乎总是一个坏主意?:)
· Catch(exception) 总是很耗时,而且在某种程度上意味着程序员知道/预期会/可能会有异常,所以更好的方法是尽可能多地使用检查,而不是捕获异常,但当然这是不可避免的。
· Debug.Write 和 Trace.Write 有什么区别?何时应该使用它们?:)
· 顾名思义,.write 意味着打印一些东西,debug 将在调试时使用,而 Trace 在发布模式下可用,根据我的知识,在发布模式下使用 debug 语句将被优雅地忽略,所以不用担心。
· Debug 构建和 Release 构建有什么区别?速度差异显著吗?为什么?:)
· Debug 构建在(pdb)文件中包含调试符号和与调试相关的元信息,而 Release 构建不包含这些信息,这就是为什么它更紧凑高效。
· JITing 是按程序集还是按方法发生?这如何影响工作集?:)
· JITing 是按方法发生的,因为 NGEN 一次性生成整个程序集的映像。如果方法高度耦合,即依赖于其他未 JIT 的方法(调用/调用其他方法),则 JITing 会降低效率。
· 比较抽象基类和接口的使用?:)
· 啊,典型的面试问题,但幸好 Scott 问了一些典型的问题 :D。抽象类可以有不同访问级别的方法实现,而接口只能有方法的声明并且必须是公共的,抽象类可以被继承。我认为纯抽象类和接口之间会有有趣且有点困难的契约。听起来不错吗?
· a.Equals(b) 和 a == b 有什么区别?:)
· Equals 检查类型,并在堆上比较对象,而 == 不检查,它只检查栈上的值。
· 在比较的上下文中,对象标识与对象等价有何区别?;)
· 标识意味着栈上的两个引用指向堆上的同一个地址,而对象等价意味着对象具有相同的值。
· 如何在 .NET 中进行深拷贝?:)
· 通常我讨厌这类典型的面试问题,但在这种(Scott)情况下,我很高兴听到。无论如何,实现 ICloneable 即可。
· 什么是装箱?:)
· 将值类型转换为引用类型称为装箱。
· 字符串是值类型还是引用类型?:)
· 这又不是一个典型的面试问题,但看在老天的份上,Scott,这不应该是由一些高级/架构师级别的 .NET 大师才知道的。无论如何,字符串是引用类型,因为它的大小可以是任意长度。
· XmlSerializer 使用的 "PropertySpecified" 模式有什么意义?它试图解决什么问题?:(
???????????? 如果您知道答案,请通过评论回复并附上参考文献。
· 为什么 out 参数在 .NET 中是一个坏主意?它们真的是吗?:)
· 当然它们不被鼓励,因为 out 关键字在某种程度上违反了返回单个值的规则,这使得函数易于阅读和调试,因为我们知道只有一个返回值的点,并且调用者可能会发送一些易受攻击的值,这些值总是应该被验证的。无论如何,有很多解决方案,例如使用数组(如果返回值是相同类型或可行的 ENUM 或集合或具有多个属性的类……)
· 属性可以放在方法的特定参数上吗?为什么这很有用?;)
· 是的,我见过在 .NET Remoting 中使用,但不太常用/需要。
C# 组件开发人员
· 比较 override 和 new 的用法。什么是遮蔽 (shadowing)?;)
· 重写(Overriding)意味着在派生类中实现虚拟/抽象/可重写方法,如果我们使用 new,则意味着它不能通过任何其他类的引用/对象访问。遮蔽(Shadowing)在某种程度上与重写相反,因为它允许重新定义方法实现以及签名。
· 解释 virtual、sealed、override 和 abstract 的用途。:)
· 通过 Virtual 关键字,我们强制派生类的程序员重写此函数。Sealed 确保类不能被继承(你可以说这样的母亲不能生育 :D),通过 abstract 类,我们能够将方法定义为抽象的,使其必须被子类重写,并且不允许任何人实例化它。
· 解释此字符串中每个组件的重要性及用途:Foo.Bar, Version=2.0.205.0, Culture=neutral, PublicKeyToken=593777ae2d274679d :)
· Foo.Bar 是程序集名称,Version 定义了其版本,遵循模式(Major, Minor, Build),用于跟踪该程序集的版本号,Culture 指定了区域设置的文化信息,PublicKeyToken 使其独一无二,因此可以保存在共享环境中并被访问。
· 解释 public、protected、private 和 internal 的区别。:)
· Public 是可共享的,所以任何人都可以访问,无论是在类/程序集/程序集之外。通过 Protected,你只能在类内或子类中访问,通过 internal,你只能在程序集内访问。
· 使用主互操作程序集 (PIA) 能带来什么好处?:(
???????????? 如果您知道答案,请通过评论回复并附上参考文献。
· NUnit 是通过什么机制知道要测试哪些方法的?:)
· 使用属性
· catch(Exception e){throw e;} 和 catch(Exception e){throw;} 有什么区别?:)
· throw 还会返回堆栈跟踪,而 throw e 不会。
· typeof(foo) 和 myFoo.GetType() 有什么区别?;)
· 第一个在编译时获取类型名称并返回结果,而第二个在运行时使用反射获取对象并返回类型。
· 解释第一个构造函数中发生了什么:public class c{ public c(string a) : this() {;}; public c() {;} } 这种构造方式有什么用?:)
· 第一个调用基构造函数。
· 什么是 this?它可以在静态方法中使用吗?:)
· this 关键字指向当前对象,而静态方法不能通过对象调用,所以不能。
ASP.NET (UI) 开发人员
· 描述基于浏览器的表单 POST 如何变成服务器端事件(如 Button1_OnClick)。 :)
· 我不确定,但我认为当我们需要在服务器端提交一些信息或操作数据时,我们使用 POST 方法,它将客户端信息通过 Request 对象传输到服务器端,服务器根据客户端提供的信息执行任务,所以在这种情况下,Button1_OnClick 被传输到服务器,并且它的处理程序调用了相关方法。
· 什么是回传 (PostBack)? :)
· 回传是一种在加载客户端信息后将其发送到服务器的方法。
· 什么是 ViewState?它是如何编码的?它加密了吗?谁使用 ViewState?:)
· ViewState 存储信息,以便在回发后可以访问,并且信息可以在任意数量的回发后持久化,但仅限于页面范围内。它被编码成 Base64 格式。它可以被加密。控件使用 ViewState 来存储控件状态和需要在回发后保留的数据。
·
· machinekey 定义了一个唯一的密钥,可以被会话和缓存使用,因此如果站点是基于集群或单点登录的,它会非常有用。
· ASP.NET 1.1 中有哪些三种会话状态提供程序?它们各自的优缺点是什么?:)
· 进程内(In-proc)、进程外(out-proc)、SQL Server
· 什么是 Web 园艺?使用它会如何影响设计?:)
· 如果服务器有多个处理器,并且请求流量相应地进行分配,这称为 Web 园艺。如果服务器正在使用外部资源(如 SQL Server、Web 服务、日志记录),那么它会非常有用。
· 对于一个 ASP.NET 应用程序,在一个单处理器机器上它有多少个应用程序对象?在双处理器机器上呢?在启用 Web 园艺的双处理器机器上呢?这会如何影响设计? :)
· 基于单个键的 HTTPApplication 对象每个工作进程只有一个,所以在单处理器机器上只有 1 个,在没有 Web 园艺的双处理器机器上也只有一个工作进程,所以仍然是单个对象,但在 Web 园艺的情况下,两个工作进程意味着 2 个对象。所以需要有机器密钥,否则…… :D
· ASP.NET 中线程会重复使用吗?每个 HttpRequest 都会获得自己的线程吗?您应该在 ASP.NET 中使用线程局部存储吗?:)
· ASP.NET 是基于 MTA 的,所以多线程是可能的,但我记得有一次我尝试通过基于回调的异步委托调用方法,这使得它在单独的线程上运行,所以当我尝试时,我在该线程中丢失了 httpcontext L。所以每个线程都有自己的线程,使用取决于需求。
· [ThreadStatic] 属性在 ASP.NET 中有用吗?是否有副作用?好还是坏?;)
· 我从未使用过它,但我认为我找到了上面提到的问题的解决方案,我们可以通过此属性在多个线程中共享 httpContext ;)
· 举例说明如何使用 HttpHandler 来简化现有设计,该设计从 .aspx 页面提供检查图像。:)
· 我们可以简单地为这样的特定需求制作 httphandler,因为 .aspx 不专门用于基于图像的网页,我们可以制作它并使事情高效,并根据我们的需求操作响应。如果页面仅基于图像并需要显示大量图像缩略图和此类功能,我们可以为这样的页面制作特定的 httpHandler,以自定义响应并对请求拥有更多控制权。
· HttpModule 可以订阅哪些类型的事件?它们对实现有什么影响?在不重新编译 ASP.NET 应用程序的情况下可以做什么?:)
· HTTPModule 订阅请求生命周期类型的事件,如 beginRequest、EndRequest、Session 等。它们对于操纵请求并根据状态和生命周期生成响应很有用。它们是 ASP.NET 应用程序引用的独立 DLL,如果我们更改 HTTPModule 并重新编译它,我们不需要重新编译整个应用程序。所以它们像插件一样插入 ;)
· 描述如何呈现一个任意的端点(URL)并将请求路由到 ASP.NET 中的该端点。;)
· 我不确定我是否正确理解了这个问题,但这是根据我对这个问题的理解给出的答案。URL 可以通过相对路径和绝对路径两种方式定义,请求可以通过重定向、转移、URL 重写等多种方式路由。
· 解释 Cookie 的工作原理。举一个 Cookie 滥用的例子。:)
· Cookie 存储在客户端,如果未加密,任何用户都可以读取。如果您在服务器上存储了有关客户端数据的一些重要信息,其他站点可能会读取 Cookie 并获取这些信息。
· HttpRequest.ValidateInput() 的重要性是什么?:)
· 它检查 Request 对象(表单、查询字符串、Cookie)中数据的完整性,您可以防止 XSS 类型的攻击并验证请求数据,以确保没有恶意输入 ;)
· 哪些数据通过 HTTP 头传递?:)
· HTTP 头包含浏览器和一些页面信息,如浏览器名称、版本、页面大小、MIME 类型、cookies
· 比较 HTTP 动词 GET 和 POST。HEAD 是什么?:);)
· GET 用于不需要在服务器端进行操作且没有真正秘密信息需要通过查询字符串发送的情况,因为它通过查询字符串发送信息,查询字符串是有限的,因此输入不能很长,比如文章 :D 但它比 POST 快得多,因为 POST 通过隐藏字段发送信息,更适合在服务器端进行操作。使用 HEAD 我们只发送页面头信息,而不是实际的内容/正文。
· 列举并描述至少六个 HTTP 状态码以及它们向请求客户端表达的含义。:)
· 非常有名的,我只记得像 404 错误页面(页面未找到),200 表示 OK,500 服务器未找到
· “if-not-modified-since”是如何工作的?如何在 ASP.NET 中以编程方式实现它?
解释 <@OutputCache%> 以及 VaryByParam、VaryByHeader 的用法。:)
· 对 if-not-modified 的东西不了解,但我可以讲 OutputCache,它是一个用于缓存内容的指令,告诉服务器 Header 信息可以通过 VaryByHeader Param 更改,参数可以通过 VaryByParam 在查询字符串中更改,因此它针对不同的 Header(如浏览器)和参数分别获取不同的版本。
· VaryByCustom 是如何工作的?:)
· 可以根据页面内任何控件、值或对象状态的变化,从缓存中输出不同的页面。
· 如何实现 ASP.NET HTML 输出缓存,缓存除 q=5 之外的所有 q 值生成的页面(例如 https:///page.aspx?q=5)的传出版本?:)
· <@OutputCache VaryByParam=”q” %>
如果我错了,请不要忘记纠正我,并请在您的答案中提供参考文献。
谢谢