ASP.NET Lab

The Best Web, The Best Future

博客园 首页 新随笔 订阅 管理

ASP.NET 允许 Web 应用的根目录下存在两个特殊目录 Bin 和 App_Code,用于存放能在不同页面之间共享的代码文件。

Bin 目录

将已编译的汇编集(.dll)存放到 Bin 目录,其他 Web 应用代码文件可以自动对其进行引用。通常被编译的代码都是开发者自定义类对象。可将编译后的汇编拷贝到 Web 应用的 Bin 目录中使自定义类能够被所有页面所用。

Bin 目录中的汇编集无需注册。存放在 Bin 目录中的 .dll 文件都能得到 ASP.NET 的认可。如果更改 .dll 文件并将新的版本写入 Bin 目录,ASP.NET 会自动检测到这一更改并在新的页面请求中使用新版本 .dll。

Bin 目录的安全性

复制已编译汇编到 Bin 目录会存在一个安全风险。因为只有编写并编译汇编的开发者才知道汇编集的具体功能是什么。然而,要想像重视其他可执行代码一样重视 Bin 目录中的已编译代码,还得保持一定的警惕性,应该进行完整的功能测试并确定对其功能有充分了解。

将已编译代码存放到 Bin 目录时,请注意下列安全情况:

  • Bin 目录中的汇编集作用范围相当应用程序全局。因此,无法执行对当前 Web 应用之外的资源访问或代码调用。

  • 运行时对汇编的访问级别依赖于本地计算机指定的可信任级别。

  • 如果使用 Visual Studio 或其他设计工具,Bin 目录中的代码在运行时将被载入到不同的上下文环境中。

App_Code 目录中的源码在运行时被自动编译。编译结果可被任何 Web 应用代码访问。App_Code 因此与 Bin 目录的工作性质相似,不同就是用源代码取代已编译代码。App_Code 目录和它在 ASP.NET Web 应用中特殊的用途使创建无须编译的自定义类对象和其他纯代码变成可能。

App_Code 目录可以包含编写成常规类对象的源代码文件(如 .vb,.cs 等)。也可以包含非编程语言编写的 .wsdl(Web Service Discovery Language)文件和 XML Schema(.xsd)文件等等,并由 ASP.NET 编译进汇编集。

App_Code 目录可以包含若干数量的文件和子目录。可以按照开发者的使用习惯来组织源代码,ASP.NET 仍可将所有代码编译进同一汇编中,并允许在 Web 应用中被其他代码访问。

推断 App_Code 目录中源码文件所用的编程语言

App_Code 没有提供对源代码所用编程语言的标记。而是由 ASP.NE 根据扩展名来推断该为 App_Code 中的源代码调用哪一种编译器(如果 App_Code 包含 .vb 文件,ASP.NET 就使用 Visual Basic 编译器;如果是 .cs 文件,则使用 C# 编译器,等等)。

如果 App_Code 目录中包含未知编程语言编写的文件(如 .wsdl 文件),ASP.NET 会使用 Web 应用程序默认编译器来编译,可以通过 Web 应用或机器配置文件中的 Compilation 元素进行配置。

在 App_Code 目录中使用多个编程语言

由于 App_Code 目录中的源代码会编译进同一汇编,所有文件都必须使用相同的编程语言。比如,App_Code 目录无法同时包含由 Visual Basic 和 C# 编写的源代码。

但是,对 Web 应用进行配置则能够将 App_Code 目录的子目录视为不同的编译单元。每个目录保存有用不同编程语言所编写的源代码。允许通过 Web.config 文件中的 Compilation 元素创建 CodeSubDirectories 子元素进行配置,同时需为目录添加特定 Web.config 文件的引用。下例描述了如何将 VBCode 和 CSCode 两个目录编译到不同的汇编集:

<compilation debug="false">
    <codeSubDirectories>
        <add directoryName="VBCode" />
        <add directoryName="CSCode" />
    </codeSubDirectories>
</compilation>

注意 VBCode 和 CSCode 子目录引用没有包括任何与编程语言的信息。跟 App_Code 目录一样,ASP.NET 同样会根据子目录中的文件类型来推断该使用哪种编译器。

App_Code 目录的安全性

App_Code 目录的安全问题与 Bin 目录一样,那就是运行时会将代码编译进同一汇编集。一个缓解因素是可在 App_Code 目录中读取源代码的内容。但是,如果对源码了解不够彻底,那么能否确认汇编集是否安全的风险将会继续存在。因此,必须像重视已编译代码一样重视 App_Code 目录中的源代码。

posted on 2006-12-05 20:27  Laeb  阅读(1219)  评论(0编辑  收藏  举报