ASP.NET 保留文件夹详解
程序员文章站
2024-03-09 16:18:05
1. bin文件夹 bin文件夹包含应用程序所需的,用于控件、组件或者需要引用的任何其他代码的可部署程序集。该目录中存在的任何.dll文 件将自动地链接到应用程序。如果在该...
1. bin文件夹
bin文件夹包含应用程序所需的,用于控件、组件或者需要引用的任何其他代码的可部署程序集。该目录中存在的任何.dll文 件将自动地链接到应用程序。如果在该文件夹中留有不用的或过期的文件,则可能出现“二义性引用(ambiguous reference)”异常的风险。换句话说,如果两个不同的程序集定义相同的类(相同的命名空间和名称),则asp.net运行库不能决定应该使用哪一 个程序集,从而抛出一个异常。在开发时,当我们重新命名一个项目或一个程序集的名称时,这是常见的错误。为了避免这种错误,一定不要在该文件夹中保留任何 不必要的程序集,或者至少要从配置文件的<assemblies>节中删除如下代码行:
<add assembly="*" />
在表1.10所列的所有文件夹中,只有bin可以被asp.net 1.x应用程序识别。该文件夹是强制性的。
2. app_browser文件夹
该可选的文件夹包含.browser文件。.browser文件描述浏览器(不管是移动设备浏览器,还是台式机浏览器)的特 征和功能。asp.net在安装路径下的config\browser文件夹中安装了大量.browser文件,这些文件供所有应用程序共享。我们只是把 当前应用程序特有的浏览器文件放在app_browser文件夹下。.browser文件的内容即时动态地进行编译,以便向asp.net运行库提供最新 的浏览器信息。
让我们简单谈谈拥有一个自定义的.browser文件可能有帮助的场景。设想应用程序使用了一个在某个浏览器下不能有效呈现的控件。在指定的浏览器中显示宿主页面时,可以编写一个.browser文件,迫使asp.net使用一个不同的适配器来生成该控件。
<browsers>
<browser id="browserid">
<controladapters>
<adapter controltype="samples.customcontrol"
adaptertype="samples.adapters.customcontroladapter" />
</controladapters>
</browser>
</browsers>
假设browserid与asp.net识别的标准浏览器之一相匹配,则上文所示的.browser文件指示在指定的浏览器下使用customcontroladapter呈现customcontrol。
3. app_code文件夹
app_code文件夹正好在web应用程序根目录下,其存储所有应当作为应用程序的一部分动态编译的类文件。这些类文件自 动链接到应用程序,而不需要在页面中添加任何显式指令或声明来创建依赖性。app_code文件夹中放置的类文件可以包含任何可识别的asp.net组件 ——自定义控件、辅助类、build提供程序、业务类、自定义提供程序、http处理程序等。
注意 在开发时,对app_code文件夹的更改会导致整个应用程序重新编译。对于大型项目,这可能不受欢迎,而且很耗时。为此,鼓励大家将代码进行模块化处理 到不同的类库中,按逻辑上相关的类集合进行组织。应用程序专用的辅助类大多应当放置在app_code文件夹中。
app_code文件夹中存放的所有类文件应当使用相同的语言。如果类文件使用两种或多种语言编写,则必须创建特定语言的子目录,以包含用每种语言编写的类。一旦根据语言组织这些类文件,就要在web.config文件中为每个子目录添加一个设置:
<compilation>
<codesubdirectories>
<add directoryname="vbfolder" />
</codesubdirectories>
</compilation>
重要的是,特定语言的子目录应在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文件来保存强名称的密钥。
注意 给一个程序集设置一个强名称,首先必须获得一个公开/私有密钥对。通过使用强名称(strong name)工具(sn.exe),可以获得这样一个密钥对。强名称工具是我们可以在.net framework的安装路径中发现的sdk binary之一。密钥对文件通常有一个.snk扩展名。可以将该文件保存到一个应用程序文件夹中,并在assemblyinfo.cs文件中引用它,如下所示:
[assembly: assemblykeyfileattribute(@"yourkeypair.snk")]
注意,visual basic .net是在包含visual studio solution的目录中寻找密钥文件,而c#编译器则在包含该binary的目录中寻找密钥文件。据此可知,用此属性调整我们使用的路径,或者把密钥文件放在合适的文件夹中。
在随后发生的任何重新生成中,程序集的名称将发生变化。同时,老的appdomain请求一结束,就删除老的程序集。
app_code文件夹并非只能包含类文件。特别是,它可以包含并能自动地处理代表数据架构的xsd文件。把一个xsd文件 添加到该文件夹中时,编译器将把它解析成一个有类型的dataset类,并将它添加到应用程序作用域中。在asp.net 1.x中,这一工作由visual studio .net向导,使用一个命令行实用程序(xsd.exe)完成的。
注意 使用web.config文件注册一个组件(例如,一个自定义的服务器控件或一个自定义的http处理程序)时,通常要求指定包含该代码的程序集名称。如 果该组件定义在app_code文件夹中,则应该用什么名称来指示程序集?在这种情况下,只是忽略程序集信息,并规定完整的类名即可。如果没有规定任何程 序集,则asp.net运行库将试图从任何已装载的程序集中装入该类,包括为app_code文件夹动态创建的程序集。
4. app_data文件夹
app_data文件夹应该包含应用程序的本地数据存储。它通常以文件(诸如microsoft access或microsoft sql server express数据库、xml文件、文本文件以及应用程序支持的任何其他文件)形式包含数据存储。该文件夹内容不由asp.net处理。该文件夹是asp.net提供程序存储自身数据的默认位置。
注意 默认asp.net帐户被授予对文件夹的完全访问权限。如果碰巧要改变asp.net帐户,一定要确保新帐户被授予对该文件夹的读/写访问权。
bin文件夹包含应用程序所需的,用于控件、组件或者需要引用的任何其他代码的可部署程序集。该目录中存在的任何.dll文 件将自动地链接到应用程序。如果在该文件夹中留有不用的或过期的文件,则可能出现“二义性引用(ambiguous reference)”异常的风险。换句话说,如果两个不同的程序集定义相同的类(相同的命名空间和名称),则asp.net运行库不能决定应该使用哪一 个程序集,从而抛出一个异常。在开发时,当我们重新命名一个项目或一个程序集的名称时,这是常见的错误。为了避免这种错误,一定不要在该文件夹中保留任何 不必要的程序集,或者至少要从配置文件的<assemblies>节中删除如下代码行:
<add assembly="*" />
在表1.10所列的所有文件夹中,只有bin可以被asp.net 1.x应用程序识别。该文件夹是强制性的。
2. app_browser文件夹
该可选的文件夹包含.browser文件。.browser文件描述浏览器(不管是移动设备浏览器,还是台式机浏览器)的特 征和功能。asp.net在安装路径下的config\browser文件夹中安装了大量.browser文件,这些文件供所有应用程序共享。我们只是把 当前应用程序特有的浏览器文件放在app_browser文件夹下。.browser文件的内容即时动态地进行编译,以便向asp.net运行库提供最新 的浏览器信息。
让我们简单谈谈拥有一个自定义的.browser文件可能有帮助的场景。设想应用程序使用了一个在某个浏览器下不能有效呈现的控件。在指定的浏览器中显示宿主页面时,可以编写一个.browser文件,迫使asp.net使用一个不同的适配器来生成该控件。
<browsers>
<browser id="browserid">
<controladapters>
<adapter controltype="samples.customcontrol"
adaptertype="samples.adapters.customcontroladapter" />
</controladapters>
</browser>
</browsers>
假设browserid与asp.net识别的标准浏览器之一相匹配,则上文所示的.browser文件指示在指定的浏览器下使用customcontroladapter呈现customcontrol。
3. app_code文件夹
app_code文件夹正好在web应用程序根目录下,其存储所有应当作为应用程序的一部分动态编译的类文件。这些类文件自 动链接到应用程序,而不需要在页面中添加任何显式指令或声明来创建依赖性。app_code文件夹中放置的类文件可以包含任何可识别的asp.net组件 ——自定义控件、辅助类、build提供程序、业务类、自定义提供程序、http处理程序等。
注意 在开发时,对app_code文件夹的更改会导致整个应用程序重新编译。对于大型项目,这可能不受欢迎,而且很耗时。为此,鼓励大家将代码进行模块化处理 到不同的类库中,按逻辑上相关的类集合进行组织。应用程序专用的辅助类大多应当放置在app_code文件夹中。
app_code文件夹中存放的所有类文件应当使用相同的语言。如果类文件使用两种或多种语言编写,则必须创建特定语言的子目录,以包含用每种语言编写的类。一旦根据语言组织这些类文件,就要在web.config文件中为每个子目录添加一个设置:
<compilation>
<codesubdirectories>
<add directoryname="vbfolder" />
</codesubdirectories>
</compilation>
重要的是,特定语言的子目录应在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文件来保存强名称的密钥。
注意 给一个程序集设置一个强名称,首先必须获得一个公开/私有密钥对。通过使用强名称(strong name)工具(sn.exe),可以获得这样一个密钥对。强名称工具是我们可以在.net framework的安装路径中发现的sdk binary之一。密钥对文件通常有一个.snk扩展名。可以将该文件保存到一个应用程序文件夹中,并在assemblyinfo.cs文件中引用它,如下所示:
[assembly: assemblykeyfileattribute(@"yourkeypair.snk")]
注意,visual basic .net是在包含visual studio solution的目录中寻找密钥文件,而c#编译器则在包含该binary的目录中寻找密钥文件。据此可知,用此属性调整我们使用的路径,或者把密钥文件放在合适的文件夹中。
在随后发生的任何重新生成中,程序集的名称将发生变化。同时,老的appdomain请求一结束,就删除老的程序集。
app_code文件夹并非只能包含类文件。特别是,它可以包含并能自动地处理代表数据架构的xsd文件。把一个xsd文件 添加到该文件夹中时,编译器将把它解析成一个有类型的dataset类,并将它添加到应用程序作用域中。在asp.net 1.x中,这一工作由visual studio .net向导,使用一个命令行实用程序(xsd.exe)完成的。
注意 使用web.config文件注册一个组件(例如,一个自定义的服务器控件或一个自定义的http处理程序)时,通常要求指定包含该代码的程序集名称。如 果该组件定义在app_code文件夹中,则应该用什么名称来指示程序集?在这种情况下,只是忽略程序集信息,并规定完整的类名即可。如果没有规定任何程 序集,则asp.net运行库将试图从任何已装载的程序集中装入该类,包括为app_code文件夹动态创建的程序集。
4. app_data文件夹
app_data文件夹应该包含应用程序的本地数据存储。它通常以文件(诸如microsoft access或microsoft sql server express数据库、xml文件、文本文件以及应用程序支持的任何其他文件)形式包含数据存储。该文件夹内容不由asp.net处理。该文件夹是asp.net提供程序存储自身数据的默认位置。
注意 默认asp.net帐户被授予对文件夹的完全访问权限。如果碰巧要改变asp.net帐户,一定要确保新帐户被授予对该文件夹的读/写访问权。