文章教程

4.2ASP.NET程序结构

8/31/2020 9:37:14 PM 人评论 次浏览

4.2 ASP.NET程序结构

程序结构大致分为两个方面:一个是文件类型;另一个是目录结构。

4.2.1 ASP.NET文件类型

ASP.NET使用特定的文件类型。以下列表提供了文件类型说明,这些文件类型在ASP.NET开发中都会遇到。

alt .aspx:包含代码分离文件的Web窗体。

alt .asax:这一文件允许用户编写代码以处理全局ASP.NET程序事件。文件中包括一个无法更改的global.asax文件。

alt .ashx:执行一个通用句柄的页面。

alt .asmx:一个ASP.NET Web服务,包括相应的代码分离文件。

alt .htm:一个标准的HTML页。

alt .css:一种在站点上使用的层叠式列表。

alt .sitemap:一种Web程序的站点地图。

alt .skin:用于指定ASP.NETA theme的文件。

alt .browser:浏览器定义文件。

alt .disco:一种可选择的文件。

alt .ascx:Web用户控件。

当然,用户也可以使用列表中没有的其他文件,这取决于程序被编译与配置的方式。

4.2.2 ASP.NET目录介绍

VS 2010编译器建立的默认项目模板包括很多目录,它们是以解决方案为基础建立的。最上面一层是解决方案目录,包括解决方案的信息文件和项目信息文件。打开具体的项目信息文件夹,可以看到默认项目模板建立的所有文件和文件夹。

Bin文件夹包含应用程序所需的用于控件、组件或需要引用的任何其他代码的可部署程序集,该目录中存在的任何.dll文件将自动链接到应用程序中。如果在该文件夹中留有不用的或过期的文件,可能出现“二义性引用(ambiguous reference)”异常的风险。换句话说,如果两个不同的程序集定义相同的类(相同的命名空间和名称),则ASP.NET运行库不能决定应该使用哪一个程序集,从而抛出一个异常。在开发时,当用户重新命名一个项目或一个程序集的名称时,这是常见的错误。为了避免这种错误,一定不要在该文件夹中保留任何不必要的程序集,或者至少要从配置文件的<assemblies>节中删除如下代码行。

alt

该可选的文件夹包含.browser文件。.browser文件描述浏览器(不管是移动设备浏览器,还是台式机浏览器)的特征和功能。ASP.NET在安装路径下的Config\Browser文件夹中安装了大量.browser文件,这些文件供所有应用程序共享。我们只是把当前应用程序特有的浏览器文件放在App_Browser文件夹下。.browser文件的内容即时动态地进行编译,以便向ASP.NET运行库提供最新的浏览器信息。

设想应用程序使用了一个在某个浏览器下不能有效呈现的控件。在指定的浏览器中显示宿主页面时,可以编写一个.browser文件,迫使ASP.NET使用一个不同的适配器来生成该控件。

alt

假设browserID与ASP.NET识别的标准浏览器之一相匹配,则上文所示的.browser文件指示在指定的浏览器下使用CustomControlAdapter呈现CustomControl。

App_Code文件夹在Web应用程序根目录下,存储所有应当作为应用程序的一部分动态编译的类文件,这些类文件自动链接到应用程序,不需要在页面中添加任何显式指令或声明来创建依赖性。App_Code文件夹中放置的类文件可以包含任何可识别的ASP.NET组件——自定义控件、辅助类、build提供程序、业务类、自定义提供程序、HTTP处理程序等。

在开发时,对App_Code文件夹的更改会导致整个应用程序重新编译。对于大型项目,这可能不受欢迎,而且很耗时。为此,建议大家将代码进行模块化处理到不同的类库中,按逻辑上相关的类集合进行组织。应用程序专用的辅助类大多放置在App_Code文件夹中。

App_Code文件夹中存放的所有类文件应使用相同的语言。如果类文件使用两种或多种语言编写,必须创建特定语言的子目录,以包含用每种语言编写的类。一旦根据语言组织这些类文件,就要在web.config文件中为每个子目录添加一个设置。

alt

重要的是,特定语言的子目录应在Web.config文件中注册,否则,不管它们属于哪个文件夹,App_Code文件夹下的所有文件将被编译成一个单独的程序集。上述配置脚本描述了这样一种情况,即所有的C#文件都放在App_Code文件夹的根目录下,而把几个Visual Basic.NET类文件移入VBFolder目录中。如果<codeSubDirectories>节中提到的目录不存在,则会收到一个编译错误提示。

App_Code根文件夹中的文件被编译成App_Code_xxx.dll程序集,其中,xxx是随机生成的字符序列。一个给定子目录中的文件将被编译成一个名为App_SubCode_xxx_yyy.dll的动态创建的程序集,其中,xxx指示子目录的名称,yyy是一个随机字符序列。只有在应用程序根目录中的Web.config文件中进行了设置,<codeSubDirectories>节才有效。

在App_Code目录或任何其他子目录中放置一个assemblyinfo.cs文件,可以创建一个强命名的程序集。显然,如果该文件夹包含Visual Basic.NET文件,将使用assemblyinfo.vb文件。程序集配置文件可以引用一个.snk文件来保存强名称的密钥。

App_Data文件夹应该包含应用程序的本地数据存储。它通常以文件(如Microsoft Access或Microsoft SQL Server Express数据库、XML文件、文本文件以及应用程序支持的任何其他文件)形式包含数据存储,该文件夹内容不由ASP.NET处理,是ASP.NET提供程序存储自身数据的默认位置。

默认ASP.NET账户被授予对文件夹的完全访问权限。如果碰巧要改变ASP.NET账户,一定要确保新账户被授予对该文件夹的读/写访问权。

正如其他应用程序一样,ASP.NET应用程序也可以使用资源,且通常应该使用资源。资源是隔离应用程序用户界面的可局部化部分的一种有效方法。一般而言,资源是与程序相关的不可执行的文本。典型的资源有图像、图标、文本和附属文件,但是任何可序列化的对象也可以被看作资源。应用程序资源存储在应用程序的外部,这样,就能在不影响和重新编译应用程序本身的情况下重新编译和替换它们。

ASP.NET应用程序需要有一个主要程序集来保存应用程序默认的或中性的资源。此外,还要部署许多附属程序集,它们各自包含用户需要支持的某种文化的本地化资源。在ASP.NET1.x中,编译一个程序集内的资源需要手动将基于XML的资源文件(那些带.res扩展名的资源)编译成.resources二进制文件,这些文件既可以嵌入到一个.NET可执行文件中,也可以编译成附属程序集。使用资源文件生成器实用程序resgen.exe,将文本和基于XML的资源文件转变为.resource文件。资源文件名称遵循baseName.cultureName. resource命名约定,其中,baseName通常是应用程序的名称:resgen.exe,ProAspNet20.resx,ProAspNet20.it.resources等。

App_LocalResources文件夹位于包含一些ASP.NET页面的文件夹下的一个子目录,该文件夹可以使用位于目录结构中高一级目录中的页面命名的.resx文件进行填充。假定父文件夹包含test.aspx,则可以在App_LocalResources文件夹中找到一些可用的资源文件:test.aspx.resx、test.aspx.it.resx和test.aspx.fr.resx。显然,上述文件中存储的资源仅对test.aspx页面有影响,因此,只能在链接的页面中看见它们(可以使用它们)。

如何访问一个页面特有的资源呢?对于编程访问,可使用如下代码。

alt

第1个参数指出页面虚拟路径;第2个参数是资源名称。对于声明式访问,使用meta:ResourceKey属性。例如,

alt

App_Themes文件夹为ASP.NET控件定义主题。主题包含在App_Themes文件夹下的一个文件夹。根据定义,一个主题是一组带有样式信息的文件。主题文件夹中的文件内容被编译,以生成一个类,而该类被页面调用以编程方式设置主题化控件的样式。

App_Themes文件夹列出应用程序的本地主题。应用程序还可以继承如下文件夹中定义的全局主题:

%WINDOWS%\Microsoft.NET\Framework\[version]\ASP.NETClientFiles\Themes

从编译的角度看,全局主题和局部主题没有区别。如果一个给定名称的主题,既存在应用程序的本地主题,又存在服务器机器的全局主题,则本地主题优先适用。

教程类别