65.9K
CodeProject 正在变化。 阅读更多。
Home

面临 .NET 技术面试:第一部分

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.28/5 (79投票s)

2005年11月29日

31分钟阅读

viewsIcon

253718

对 .NET 面试的技术内容进行简要准备。

引言

看起来我将提供关于如何应对 .NET 技术面试的指导。抱歉,但这并非本系列文章的内容。我曾花费大量精力为各种开发职位准备面试中遇到的技术问题。

在本系列文章中,我将解释一些技术面试中经常被问到的问题。开头(在本篇及后续文章中)我们将先梳理核心技术内容,之后再解释一些棘手和令人困惑的概念。

在 .NET 技术面试中,通常会问及 .NET Framework、VB.NET、C#.NET、Managed C++、ASP.NET 等方面的问题。问题可以涉及概念性,也可以与实际问题相关。在本系列中,我将先涵盖概念性问题,然后是一些实际问题。

废话少说,我们直接开始。

Microsoft .NET

.NET Framework
.NET Framework 是一个为多种语言提供面向对象编程模型环境的平台。它封装了操作系统,使软件开发能够摆脱许多操作系统特定的任务,例如文件处理、内存分配和管理。
它有两个主要组件:CLR(公共语言运行时)和 .Net BCL(基类库)。
Sample screenshot
如您在图中所示,.NET Framework 运行在操作系统之上,它可以是 Windows 的几种不同版本,并包含许多组件。.NET 本质上是一个运行在 Windows 上的系统应用程序。

Framework 中最重要的组件是 CLR。如果您是 Java 程序员,可以将 CLR 视为 .NET 中等同于 Java 虚拟机 (JVM) 的东西。如果您不懂 Java,可以将 CLR 视为 .NET 架构的核心和灵魂。从宏观上看,CLR 激活对象,对其执行安全检查,在内存中布局它们,执行它们,并进行垃圾回收。从概念上讲,CLR 和 JVM 相似之处在于它们都是运行时基础设施,可以抽象底层平台差异。然而,虽然 JVM 目前只支持 Java 语言,但 CLR 支持所有可以表示为通用中间语言 (CIL) 的语言。JVM 执行字节码,因此理论上也可以支持多种语言。但与 Java 的字节码不同,IL 永不解释执行。这两种基础设施之间的另一个概念性区别是 Java 代码运行在支持 JVM 的多个平台上,而 .NET 代码(在撰写本文时)只运行在支持 CLR 的 Windows 平台上。微软已将通用语言基础设施 (CLI),它在功能上是 CLR 的一个子集,提交给 ECMA,因此第三方供应商理论上可以为 Windows 以外的平台实现 CLR。

程序集是部署和版本控制的基本单位,它由一个清单、一个或多个模块组成,以及一组可选的资源。

.NET 可移植可执行文件
Windows 可执行文件 EXE 或 DLL 必须符合 PE 文件格式,该格式是 Microsoft Common Object File Format (COFF) 的衍生。这两种格式都经过完全规范并公开可用。Windows 操作系统知道如何加载和执行 DLL 和 EXE,因为它理解 PE 文件的格式。鉴于此,任何想要生成 Windows 可执行文件的编译器都必须遵循 PE/COFF 规范。

标准的 Windows PE 文件分为两个主要部分。第一部分包含引用 PE 文件内容的 PE/COFF 头。除了头部分,PE 文件还包含许多本地映像部分,包括 .data、.rdata、.rsrc 和 .text 部分。这些是典型的 Windows 可执行文件的标准部分,但微软的 C/C++ 编译器允许您使用编译器 pragma 语句将自己的自定义部分添加到 PE 文件中。例如,您可以创建自己的数据部分来存储只有您自己才能读取的加密数据。利用这个能力,微软在正常的 PE 文件中添加了一些新的部分来专门支持 CLR 的功能。CLR 理解并管理这些新部分。例如,CLR 将读取这些部分并确定如何在运行时加载类和执行您的代码。

微软添加到正常 PE 格式中的部分是 CLR 头和 CLR 数据部分。CLR 头存储信息以指示 PE 文件是 .NET 可执行文件,而 CLR 数据部分包含元数据和 IL 代码,这两者都决定了程序的执行方式。

元数据

元数据是关于资源的机器可读信息,即“关于数据的数据”。此类信息可能包括内容的详细信息、格式、大小或数据源的其他特征。在 .NET 中,元数据包括类型定义、版本信息、外部程序集引用和其他标准化信息。

为了使两个组件、系统或对象能够相互操作,至少一方必须了解另一方。在 COM 中,这个“了解”是一个接口规范,由组件提供者实现,并由其使用者使用。

在 .NET 中,元数据是 .NET 运行时、编译器和工具都可以使用的通用机制或方言。Microsoft .NET 使用元数据来描述特定 .NET 程序集使用的和公开的所有类型。元数据包括对程序集和模块、类、接口、方法、属性、字段、事件、全局方法等的描述。

.NET 程序集是可部署单元,而清单是描述程序集的元数据。

IL 代码

程序集包含 CLR 在运行时执行的 IL 代码。IL 代码通常使用同一程序集内定义的类型,但它也可以使用或引用其他程序集中的类型。有一个警告:每个程序集最多只能有一个入口点,例如 DllMain()、WinMain() 或 Main()。您必须遵守此规则,因为当 CLR 加载程序集时,它会搜索其中一个入口点来开始程序集的执行。

在 .NET 中有四种类型的程序集。

静态程序集: 这些是您在编译时创建的 .NET PE 文件。您可以使用您喜欢的编译器(csc、cl 或 vbc)创建静态程序集。
动态程序集: 这些是 PE 格式的内存中程序集,您可以在运行时使用 System.Reflection.Emit 命名空间中的类动态创建它们。
私有程序集: 这些是供特定应用程序使用的静态程序集。
公共或共享程序集: 这些是静态程序集,必须具有唯一的共享名称,并且可以供任何应用程序使用。

并行执行

CLR 允许同一共享 DLL(共享程序集)的任何版本在同一系统上、同一进程中同时执行。这个概念被称为并行执行。

清单:程序集元数据
程序集清单是描述程序集所有信息的元数据,包括其身份、属于程序集的文件的列表、对外部程序集的引用、导出的类型、导出的资源以及权限请求。简而言之,它描述了组件即插即用所需的所有详细信息。由于程序集包含所有这些详细信息,因此无需像 COM 世界那样将此类型的信息存储在注册表中。

程序集可以是单模块程序集或多模块程序集。在单模块程序集中,构建中的所有内容都打包到一个 EXE 或 DLL 中,例如我们之前开发的 hello.exe 应用程序。这很容易创建,因为编译器会负责为您创建单模块程序集。

多模块程序集是指包含许多模块和资源文件的程序集。要创建它,您必须使用 .NET SDK 提供的程序集链接器 (al.exe)。此工具接收一个或多个 IL 或资源文件,然后生成一个带有程序集清单的文件。

任何 .NET 语言都可以转换为 IL,因此 .NET 支持多种语言,并且将来可能支持多种平台(只要目标平台拥有 CLR)。

通用类型系统 (CTS)
由于 .NET 将所有语言视为平等,因此用 C# 编写的类应该等同于用 VB.NET 编写的类,并且用 Managed C++ 定义的接口应该与用托管 COBOL 指定的接口完全相同。语言在集成之前必须就这些概念的含义达成一致。为了实现语言集成,微软规定了一个所有 .NET 语言都必须遵守的通用类型系统。

接口
接口支持与 C++ 抽象基类 (ABC) 完全相同的概念,该类只有纯虚函数。ABC 是声明一个或多个纯虚函数因而不能实例化的类。如果您熟悉 COM 或 Java,.NET 中的接口在概念上等同于 COM 或 Java 接口。您指定它们,但不实现它们。派生自您的接口的类必须实现您的接口。接口可以包含方法、属性、索引器和事件。在 .NET 中,一个类可以派生自多个接口。

通用语言规范 (CLS)
微软已发布通用语言规范 (CLS)。CLS 规定了一系列对语言集成至关重要的基本规则。由于微软提供了定义 .NET 语言最低要求的 CLS,因此编译器供应商可以根据规范构建他们的编译器并提供面向 .NET 的语言。除了编译器编写者,应用程序开发人员也应该阅读 CLS 并使用其规则来保证语言互操作性。

CLR 执行
.Net PE 文件(元数据和 IL)>> 类加载器 >> 验证器 >> JIT >> 托管本机代码

类加载器找到并加载目标类后,它会缓存类的类型信息,以便在此过程的持续时间内不必再次加载该类。

验证器负责验证:
1. 元数据格式正确,意味着元数据必须有效。
2. IL 代码是类型安全的,意味着类型签名使用正确。

JIT 编译器将 IL 转换为本机代码,以便它可以在目标操作系统上执行。出于优化原因,JIT 编译仅在方法首次调用时发生。回想一下,类加载器在类加载期间向每个方法添加一个存根。在首次调用方法时,VEE 读取此存根中的信息,该信息告诉它该方法尚未进行 JIT 编译。在此指示下,JIT 编译器编译该方法并将托管本机方法的地址注入此存根。在后续调用同一方法时,无需 JIT 编译,因为每次 VEE 读取存根中的信息时,它都会看到本机方法的地址。由于 JIT 编译器仅在方法首次调用时执行其魔力,因此运行时不需要的方法永远不会被 JIT 编译。编译后的本机代码将保留在内存中,直到进程关闭,直到垃圾回收器清除与进程相关的所有引用和内存。这意味着下次执行进程或组件时,JIT 编译器将再次执行其魔力。

如果您想避免运行时 JIT 编译的开销,可以使用一个名为 ngen 的特殊工具,它会在安装和设置时编译您的 IL。使用 ngen,您可以 JIT 编译代码一次并将其缓存到机器上,以便在运行时避免 JIT 编译(此过程称为预 JIT)。如果 PE 文件已更新,您必须再次预 JIT PE 文件。否则,CLR 可以检测到更新并动态命令相应的 JIT 编译器来编译程序集。

所有 .NET 程序集本质上都是二进制组件。您可以将每个 .NET 程序集视为一个组件,可以将其插入另一个组件或应用程序中,而无需源代码,因为组件的所有元数据都存储在 .NET 程序集内部。虽然在 COM 中构建组件需要大量杂乱的工作,但在 .NET 中构建组件只需零额外工作,因为所有 .NET 程序集本质上都是组件。请记住,我们将“组件”一词用作二进制、可部署单元,而不是 COM 类。

共享组件
与应用程序私有程序集不同,共享程序集(任何客户端应用程序都可以使用的程序集)必须发布或注册到系统的全局程序集缓存 (GAC) 中。当您将程序集注册到 GAC 时,它们就像系统组件一样,例如系统 DLL,系统中的每个进程都可以使用它。GAC 注册的前提是组件必须具有发布者和版本信息。除了其他元数据之外,这两项允许同一组件的多个版本在同一台机器上注册和执行。同样,与 COM 不同,我们无需为客户端使用这些共享程序集将任何信息存储在系统注册表中。

对象池
池是技术术语,指的是一组资源,例如连接、线程和对象。将一些对象放入池中允许数百个客户端共享这些对象(您可以对线程、连接和其他对象提出同样的断言)。因此,池是一种最小化系统资源使用、提高性能并帮助系统可伸缩性的技术。

ADO.NET 架构
Microsoft ADO.NET 的对象模型包含两个不同的类组:内容组件和托管提供程序组件。内容组件包括 DataSet 类和其他支持类,如 DataTable、DataRow、DataColumn 和 DataRelation。这些类包含数据交换的实际内容。托管提供程序组件协助数据检索和更新。微软在其 ADO.NET 的当前版本中提供了两个托管提供程序:OLE DB 和 SQL。OLE DB 托管提供程序附带 OleDbConnection、OleDbCommand、OleDbParameter 和 OleDbDataReader。SQL Server 托管提供程序附带一套类似的、名称以 SqlClient 而非 OleDb 开头的对象。开发人员可以使用连接、命令和数据读取器对象直接操作数据。

我们可能会认为设置和拆除连接不是一个好主意,因为建立连接的成本通常很高。这仅在没有连接池的情况下才是问题。ADO.NET 会自动将数据源的连接保留在池中,因此当应用程序认为它正在拆除连接时,它实际上是将连接返回到资源池。这允许连接被重用,从而避免了从头开始重建新连接的成本。

由于 ADO.NET Framework 类是托管代码,开发人员可以继承和扩展这些类以满足其自定义需求。

数据读取器是一个新对象,提供快速、仅向前、只读的数据访问。这类似于具有服务器端、仅向前、只读游标类型的 ADO Recordset。由于这是服务器端游标,因此在读取数据期间与服务器的连接是打开的。

即使每个 DataAdapter 只映射一个 DataSet 中的 DataTable,您也可以拥有多个适配器来用多个 DataTable 填充 DataSet 对象。托管代码:
.Net Framework 为在其内部运行的程序提供了一些核心运行时服务。例如异常处理和安全。为了使这些服务正常工作,代码必须向运行时提供最低级别的信息。这样的代码称为托管代码。

托管数据
这是由 .Net 运行时垃圾回收器进行内存管理的数据,包括分配和释放任务。我们可以通过执行 System.GC.Collect() 来调用垃圾回收器来收集未引用的数据。

什么是程序集?
程序集是 .Net Framework 的基本构建块。它们包含可用于构建应用程序的类型和资源。程序集支持代码重用、版本控制、安全和部署。程序集包含:清单类型元数据MSIL资源文件

程序集有私有和共享之分。私有程序集用于单个应用程序,安装在应用程序的安装目录或其子目录中。共享程序集是可以被多个应用程序引用的,并且驻留在 GAC(由 .Net Framework 管理的程序集本地缓存)中。
gacutil /i myDll.dll 可以查看,以及 %windir%\assembly

元数据和清单
清单描述程序集本身。包括程序集名称、版本、区域性、强名称、文件列表、类型引用和引用程序集。而元数据则描述程序集内的内容,如类、命名空间、接口、作用域、属性、方法及其参数等。

应用程序域
它是一个用于隔离应用程序的虚拟进程。在同一应用程序范围内创建的所有对象都在同一个应用程序域中创建。

垃圾回收
它是 .Net Framework 的自动内存管理器。它管理分配给 .Net Framework 的内存。
当定义一个变量时,它会在内存(堆栈)中获得一个空间;当创建一个对象时,对象的内存会在堆中分配。当对象赋值给变量时,会增加该对象的引用计数;当程序控制退出函数时,变量的作用域结束;或者将 NULL 赋值给变量时,对象的引用计数会减 1。当一个对象的引用计数变为零时,GC 会执行对象的析构函数,然后释放对象占用的内存。

能否从 COM 使用 .Net 组件?
可以。但有一些限制,例如 COM 需要一个对象来创建。所以静态方法、带参数的构造函数无法从 COM 使用。COM 使用 COM 可调用包装器 (CCW) 来使用它们。
TlbImp.exe 和 TlbExp.exe

.NET Remoting 如何工作?
它涉及通过通道发送消息。两个标准通道是 HTTP 和 TCP。TCP 仅用于 LAN,HTTP 可用于 LAN 或 WAN(互联网)。TCP 使用二进制序列化,HTTP 使用 SOAP(.Net Runtime Serialization SOAP Formatter)。

有 3 种远程访问样式。
SingleCall:每次传入请求都由新实例处理。
Singleton:所有请求都由单个服务器对象处理。
Client-Activated Object:这是旧的状态ful DCOM 模型。客户端接收远程对象的引用,并一直保留直到完成其使用。

DLL HELL
指需要将同名但不同版本的 DLL 放在同一个目录中的情况。

版本控制
MajorVersion.MinorVersion.BuildNumber.Revision

装箱和拆箱
值类型到引用类型的隐式(自动)转换称为装箱,而引用类型到值类型的显式(手动)转换称为拆箱。(将 Integer 变量转换为 object 类型)

.Net 面向对象编程概念


类是实体的具体表示。它代表一组具有相似属性和行为的对象。
提供抽象和封装。可以为同类对象组赋予的类别名称。

对象
对象代表/类似于物理/现实实体。对象只是您可以为其命名的东西。

面向对象编程
它是一种编程风格,将程序表示为对象系统并实现代码重用。

封装
属性和行为的绑定。隐藏实现并暴露功能。

抽象
隐藏复杂性。为功能定义通信接口,并隐藏其余部分。
在 .Net 中,析构函数不能是抽象的。您可以定义 Finalize / Destructor 中的任何一个。对于析构函数,不能指定访问修饰符。它是私有的。

重载
在同一类/派生类中添加一个同名但参数数量/类型不同的新方法。实现多态性。

重写
当我们想提供与基类提供的不同实现时,我们在派生类中定义相同签名的方法。为此,方法必须是 Protected/Protected-Friend/Public。(可以使用 Mybase.Method、base.Method 调用基类例程)。

隐藏
当方法在基类中定义为 Final/sealed 且不可重写,而我们需要为其提供不同实现时。我们使用 Shadows/new 定义方法。

继承
允许您提供“is-a”关系。从另一个类获取属性和行为。当一个类从另一个类获取属性和行为时。(在 .Net 中,类不能是 Final 或 sealed)

抽象类
无法创建实例。可以选择有一个或多个抽象方法,但非必需。可以为类提供主体。

接口
类必须做什么,但不怎么做。
当调用者不知道自己在调用谁时,用于通信的桥梁。
描述元素的外部可见行为。
仅公共成员,定义了与外部世界的通信方式。可以是“可用作”关系。
不能包含数据,但可以声明属性。不能有实现。接口可以派生自另一个接口。

多态
表示多种形式。根据参数数量/类型不同提供不同实现的能力。方法根据不同的输入参数表现不同。不依赖于返回值。

纯多态
在基类中将方法设为抽象/虚拟。在派生类中重写它。声明一个基类类型的变量,并将派生类对象分配给它。现在调用虚拟/抽象方法。实际调用的方法在运行时决定。

早期绑定
调用非虚拟方法,在编译时决定调用哪个方法称为早期绑定。

后期绑定
与纯多态相同。

标识符/访问修饰符和作用域
VB.NET:Private、Protected、Friend、Protected Friend、Public。
C#:private, protected, internal, protected internal, public。

什么是委托?
强类型函数指针。委托对象封装对方法的引用。实际调用哪个函数将在运行时决定。

静态变量及其生命周期
VB.NET:Public Shared VAR As Type。
C#:public static Type VAR;
生命周期直到类在内存中。

构造函数
每次创建类实例时都会调用的特殊方法。

析构函数/Finalize
在 GC 回收对象之前由 GC 调用。

ASP.Net

不同类型的缓存?
输出缓存:存储 asp.net 页面的响应。
片段缓存:仅缓存/存储页面的一部分(用户控件)
数据缓存:用于性能的缓存对象的编程方法。

身份验证和授权
身份验证是根据凭据(用户名和密码)识别/验证用户,授权在身份验证之后执行。授权允许用户访问特定资源。

不同类型的指令
Page、Register、Control、OutputCache、Import、Implements、Assembly、Reference

服务器端和客户端的区别
服务器端代码在 Web 服务器上执行,不传输到客户端;而客户端代码在客户端(浏览器)上执行,并随内容一起呈现给客户端。

Server.Transfer 和 Response.Redirect 的区别
两者都会立即结束当前请求的处理。Server.Transfer 在不通知客户端(浏览器)的情况下开始执行参数中指定的另一个资源,而 Response.Redirect 会告知客户端您请求的资源在此位置可用,然后客户端请求该资源。

不同类型的验证器和验证控件
RequiredFieldValidator、RangeValidator、RegularExpressionValidator、CompareValidator、CustomValidator、ValidationSummary

如何在 ASP.Net 中管理状态?
客户端:ViewState、QueryString 和 Cookies。服务器端:Session、Application。

用户控件和自定义控件的区别
自定义控件是编译过的代码(DLL),易于使用,但创建困难,并且可以放在工具箱中。拖放控件。可以在设计时直观地设置属性。可以被多个应用程序使用(如果是共享 DLL),即使是私有 DLL 也可以复制到 webApp 的 bin 目录中,添加引用并使用。通常设计用于提供独立于消耗应用程序的通用功能。

Session 状态模式的 3 种类型?
InProc(无 cookie,超时),
StateServer(服务器,端口 stateConnectionString="tcpip=server:port"),
SQLServer(sqlconnectionstring)和 Off。

什么是 ViewState?它是如何管理的?其优点/好处是什么?
ViewState 是 ASP.NET 用于维护页面及其所有 Web 控件/服务器控件状态的特殊对象。它在这种对象中保留了表单元素在回发期间的状态。它作为隐藏变量 __VIEWSTATE 在 <form> 标签下呈现给客户端(浏览器)。我们也可以向其中添加自定义值。

什么是 web.config 和 machine.config?
machine.config 是此版本下所有应用程序的默认配置,位于 %WinDir%\Microsfot.Net\Framework\Version。设置可以通过 Web.Config 为特定应用程序覆盖。Web.Config 位于应用程序的根目录/虚拟根目录,并存在于后续文件夹中。

Global.asax 的作用
可选文件,包含处理 ASP.Net 或 HttpModule 引发的应用程序级别事件的代码。此文件位于应用程序根目录中。Application_Start、_End、_AuthenticateRequest、_Error、Session_Start、_End、BeginRequest、EndRequest。此文件被解析并编译成派生自 HttpApplication 的动态生成类。

页面生命周期
Init、LoadViewState、LoadPostBackData、Load、RaisePostBackDataChangedEvent、RaisePostBackEvents、Pre-Render、SaveViewState、Render、Unload、(IpostBackDataChangedEventHandler 和 IpostBackEventHandler)Error、CommitTransaction、AbortTransaction、Abort
inetinfo.exe、aspnet_isapi.dll aspnet_wp.exe、HttpModules(OutputCache、Session、Authentication、Authorization、Custom Modules Specified),然后是 HttpHandlers PageHandlerFactory(用于 *.aspx)

服务器端 <form> 标签的 action 属性可以设置为某个值吗?如果不能,如何将数据从表单传递到后续页面?
不行,赋值无效,因为在渲染时会被覆盖。我们可以通过注册一个启动脚本来为其赋值,该脚本将在客户端设置表单的 action 值。其余的可以通过 Server.Transfer 和 Response.Redirect 实现。

ASP.Net 列表控件及其区别?
RadioButtonList、CheckBoxList、DropDownList、Repeater、DataGrid、DataList

代码隐藏类中的代码类型
服务器端代码。

什么内容最适合放在 Application_Start 和 Session_Start 中?
App_Start 中进行应用程序级别变量和设置的初始化。
Session_Start 中进行用户特定变量和设置。

行内代码和代码隐藏的区别。哪种更好?
行内代码与 HTML 混合,代码隐藏则分离。使用代码隐藏,因为行内页面在每次首次请求页面时都会加载、解析、编译和处理,并且编译后的代码会保留在缓存中直到过期。如果过期,它会再次加载、解析和编译,而代码隐藏允许预编译并提供更好的性能。

要显示 Repeater 中的数据,必须提供哪个模板?
ItemTemplate。

如何在 Repeater 中提供交替的颜色方案?
AlternatingItemTemplate

所有 Web 窗体继承自哪个基类?
System.Web.UI.Page

您使用什么方法显式终止用户的 Session?
HttpContext.Current.Session.Abandon()

如何在 asp.net 应用程序的某个页面中关闭 cookie?
我们不会使用它。但不能从服务器关闭 cookie。允许或不允许是客户端功能。

每个验证控件都有哪两个属性?
ControlToValidate 和 Text、ErrorMessage

如何创建永久 cookie?
将 expires 属性设置为 Date.MaxValue (HttpCookie.Expires = Date.MaxValue)

用于封装 Web 服务调用的标准是什么?
SOAP

您使用什么方法在不进行客户端往返的情况下将用户重定向到另一个页面?
Server.Transfer("AnotherPage.aspx")

调用 Web 服务 SOAP 时使用什么传输协议?
HTTP-POST

Web 服务只能用 .NET 编写吗?
FALSE

在哪里可以在互联网上找到 Web 服务?
www.uddi.org

单个 .NET DLL 可以包含多少个类?
无限

.NET 1.1 版本中有多少个命名空间?
124

什么是冒泡事件?
当您有一个像 DataGrid 这样复杂的控件时。为每个对象(单元格、按钮、行等)编写事件处理例程。DataGrid 会处理其组件的事件,并引发其自己定义的自定义事件。

ASP Session 状态和 ASP.Net Session 状态的区别?
ASP:依赖 cookie,序列化来自客户端的所有请求,进程关闭后无法存活,无法在 Web Farm/Garden 的机器之间维护。

ASP.NET 页面的布局
GridLayout 和 FlowLayout

Web 用户控件
使用 VS.Net 将现有的服务器控件和 HTML 控件组合起来,创建封装 UI 某些方面的功能单元。驻留在内容文件中,这些文件必须包含在使用该控件的项目中。

复合自定义控件
现有 HTML 和服务器控件的组合。

渲染自定义控件
通过直接渲染 HTML 来创建全新的控件,而不是通过组合。

用户区域设置信息存储在哪里?
Page.Culture

日期输入的验证应该发生在客户端/服务器端?
两者。客户端减少了额外的往返。服务器端确保防止黑客攻击和自动请求失败。

HTTP GET 和 HTTP POST
顾名思义,HTTP GET 和 HTTP POST 都使用 HTTP 作为其底层协议。这两种方法都将请求参数编码为服务器上处理请求的脚本 URL 的名称/值对。GET 方法创建一个查询字符串并将其附加到脚本的 URL。对于 POST 方法,名称/值对在 HTTP 请求消息的正文中传递。

Web 服务发现
虽然 Web 服务的广告很重要,但它是可选的。Web 服务可以是私有的,也可以是公开的。根据业务模式,一些企业对企业 (B2B) 服务通常不会公开宣传。相反,Web 服务所有者只会向业务合作伙伴提供有关访问和使用其服务的具体说明。为了公开宣传 Web 服务,作者会在互联网上发布发现文件。潜在的 Web 服务客户端可以浏览这些文件以获取有关如何使用 Web 服务的信息—WSDL(Web 服务描述语言)。可以将其视为 Web 服务的电话黄页。它只是指向实际 Web 服务所在的位置以及这些 Web 服务的描述。查找服务和查看服务描述的过程称为 Web 服务发现。有两种宣传服务的方式:静态和动态。在这两种方式中,XML 都传达了 Web 服务的位置。

静态发现更容易理解,因为它是显式的。如果您想宣传您的 Web 服务,则必须显式创建 .disco 发现文件并将其指向 WSDL。

与显式指定网站支持的所有 Web 服务的 URL 相反,您可以启用动态发现,这样可以自动列出您网站上特定 URL 下的所有 Web 服务。对于您的网站,您可能希望将相关的 Web 服务分组到许多不同的目录中,然后在每个目录中提供一个动态发现文件。

Web 服务和安全
我们通过两种方式将安全性融入 Web 服务:系统安全和应用程序安全。系统级安全允许限制未经授权的客户端访问 Web 服务。这是以声明式方式完成的,而应用程序级安全则更具灵活性。通过系统级安全,您很可能通过某些配置管理工具拥有允许访问您的 Web 服务的授权客户端 IP 地址列表。通过应用程序级安全,您可以将身份验证集成到您的 Web 服务中,从而提供更灵活的配置。

在系统级安全中,客户端以纯文本格式或某种加密格式将用户名和密码发送到 Web 服务器。一旦服务器验证了用户,它就可以访问服务器可用的服务。

在应用程序级安全模式下,您的 Web 服务需要自己处理安全问题。您可以编程您的 Web 服务,使其所有方法都需要一个访问令牌,该令牌可以在发送客户端的用户名和密码后从 Web 服务中获取。客户端凭据可以通过 SSL(安全套接字层)发送到服务器,这消除了通过线路发送纯文本密码的风险。通过此 SSL 通道,服务器将访问令牌返回给调用者,调用者可以使用该令牌调用所有其他 Web 服务方法。

Web 窗体事件
Web 窗体生命周期中发生的第一个事件是 Init 事件。该事件被引发,以便我们可以进行页面的初始化代码。此时页面上的控件尚未创建。每次用户使用页面时都会引发此事件。

Load 事件紧随 Init 事件之后。之后,每次请求页面时都会引发它。当此事件被引发时,Web 窗体的所有子控件都已加载并可访问。您应该能够检索数据并填充控件,以便在将它们发送回客户端时可以呈现自身。

PreRender 事件发生在页面被渲染并发送回客户端之前。我们通常不处理此事件;但是,这取决于具体情况。

Web 窗体中的最后一个事件是 Unload 事件。当页面从内存中卸载时会发生这种情况。最终的清理工作应在此处完成。

Web 窗体生命周期
在 ASP .NET 中,当客户端请求特定页面时,Web 页面的生命就开始了。IIS 解析并运行 ASP 页面上的脚本以呈现 HTML 内容。页面渲染完成后,页面的生命就结束了;只有页面的视图状态会在页面请求之间持久化。这些视图状态允许服务器上的控件显示为它们仍然存在以处理服务器事件。

使用 Web 服务
在 Visual Studio.NET IDE 中,您可以选择 Project >> Add Web Reference,然后输入 Web 服务所在的 URL。例如,我们将指向我们创建的本地服务器上的 Web 服务,例如 PubsWS(假设)。服务器上该 Web 服务的 URL 是 https:///PubsWS/PubsWS.asmx。添加 Web 引用后,您可以通过类型 servername.proxyObjectName 访问您正在调用的 Web 服务的代理对象。对您来说,它是 localhost.PubsWS。

以下代码片段演示了如何通过代理使用 Web 服务。我们创建一个代理对象实例,然后让它将消息中继给实际的 Web 服务以获取作者列表。结果将以 XML 格式流式传输回来,并重构为 DataSet 对象。

[C#]
localhost.PubsWS ws = new localhost.PubsWS( ); DataSet ds = ws.GetAuthors( );

ASP.NET Session-State 管理
ASP.NET 通过转向进程外模型改进了 ASP 的 session-state 管理。通过让 Farm 中的所有 Web 服务器指向一个托管进程外状态管理器的通用服务器,可以在 Farm 中重定向 Web 客户端而不会丢失 session 状态。通过使用进程外模型,当 IIS 进程被循环利用时,我们不再会丢失 session 状态的问题。这意味着如果 Web 服务器应用程序因任何原因崩溃并在会话超时时间内重新启动,Web 客户端仍然可以保持所有 session 状态完好无损。当然,如果进程外状态管理器崩溃了,那又是另一回事了。这引出了 ASP.NET 的下一个改进——将 session 状态持久化到数据库的能力。

有两种配置级别:机器和应用程序。机器级别配置与存储在 WinNT\Microsoft.NET\ Framework\ 的 machine.config 文件相关联。\CONFIG\machine.config,而应用程序级别配置使用应用程序根目录中的 web.config 文件。应用程序级别配置将覆盖机器级别配置。

缩略语


CCW COM 可调用包装器
CLI 通用语言基础设施。它是 CLR 和基类库的一个子集,微软已将其提交给 ECMA,以便第三方供应商可以在其他平台上构建 .NET 运行时。
CLR 公共语言运行时
CLS 通用语言规范
COFF 通用对象文件格式
COM 组件对象模型
CTS 通用类型系统
DISCO Web 服务发现。Web 服务有一个或多个 .DISCO 文件,其中包含有关如何访问其 WSDL 的信息。
DNA 分布式 Internet 应用程序架构。
DOM 文档对象模型
GDI 图形设备接口
GAC 全局程序集缓存
GUID 全局唯一标识符
HTTP 超文本传输协议
IDL 接口定义语言
IL 中间语言
MSIL Microsoft 中间语言
MS-DTC Microsoft 分布式事务协调器
N-Tier 多层
OLTP 在线事务处理
OLAP 在线分析处理
PE 便携式可执行文件
RAD 快速应用程序开发
RCW 运行时可调用包装器
SMTP 简单邮件传输协议
SOAP Simple Object Access Protocol
TCP 传输控制协议
TLB 类型库
UDF 统一数据格式
UI 用户界面
URL 统一资源定位符
UDDI 通用描述、发现和集成
WAP 无线访问协议
WSDL Web 服务描述语言
WML 无线标记语言
XML Extensible Markup Language


结论

正如我之前提到的,这是一个系列文章,这是第一部分,我指定了一些与 .NET 相关的初步概念。在接下来的文章中,我将详细介绍所有概念,并对本文进行更新。因为我还在准备中。

您的建议和评论将有助于提高我文章的质量,请随时对内容发表评论。

历史


1. 2005 年 11 月 29 日:首次上传。
2. 2005 年 12 月 28 日:添加了 .NET Framework 的详细部分。

尽情开发 </form>
© . All rights reserved.