Carpetas de código compartido en sitios Web ASP.NET

Actualización: noviembre 2007

Si la aplicación Web incluye código que desea compartir entre las páginas, puede guardarlo en una de las dos carpetas especiales que hay debajo de la raíz de la aplicación Web, Bin y App_Code.

Carpeta Bin

Puede almacenar ensamblados compilados en esta carpeta y el resto del código de cualquier parte de la aplicación Web (como el de las páginas) hará referencia a ella automáticamente. Un ejemplo típico es el código compilado de una clase personalizada. Puede copiar el ensamblado compilado en la carpeta Bin de la aplicación Web y, a continuación, la clase estará disponible para todas las páginas.

Los ensamblados de la carpeta Bin no necesitan registrarse. La presencia de un archivo .dll en la carpeta Bin es suficiente para que ASP.NET lo reconozca. Si cambia el archivo .dll y escribe una nueva versión del mismo en la carpeta Bin, ASP.NET detectará la actualización y utilizará la nueva versión para las nuevas solicitudes de página a partir de ese momento.

Seguridad de la carpeta Bin

La colocación de los ensamblados compilados en la carpeta Bin pueden comprometer la seguridad. Si escribió el código y lo compiló, sabrá cuál es su función. Sin embargo, deberá tratar el código compilado de la carpeta Bin como cualquier otro código ejecutable. Tenga cuidado con el código compilado hasta que lo haya probado y esté seguro de que entiende su funcionamiento.

Tenga en cuenta los siguientes aspectos de seguridad al colocar el código compilado en la carpeta Bin:

  • El ámbito de los ensamblados de la carpeta Bin es la aplicación actual. Por consiguiente, no pueden tener acceso a recursos ni invocar código que se encuentre fuera de la aplicación Web actual.

  • En tiempo de ejecución, los niveles de acceso de un ensamblado se establecen de acuerdo con el nivel de confianza especificado en el equipo local. Para obtener más información, vea Niveles de confianza y archivos de directivas de ASP.NET.

  • Si está trabajando con un diseñador como Visual Studio, el código de la carpeta Bin se ejecuta en un contexto distinto del contexto en tiempo de ejecución. Por ejemplo, el código podría ejecutarse con plena confianza.

Carpeta App_Code

Si almacena el código fuente en la carpeta App_Code, se compilará automáticamente en tiempo de ejecución. Al ensamblado resultante puede tener acceso cualquier otro código de la aplicación Web. Por tanto, la carpeta App_Code funciona como la carpeta Bin, salvo que se puede almacenar código fuente en lugar de código compilado. La carpeta App_Code y su estado especial en una aplicación Web ASP.NET permiten crear clases personalizadas y otros archivos que sólo contienen código fuente, y utilizarlos en la aplicación Web sin tener que compilarlos independientemente.

Esta carpeta puede contener archivos de código fuente escritos como archivos de clase tradicionales (es decir, archivos con extensión .vb, .cs, etc.). Sin embargo, también puede incluir archivos que no sean explícitamente de un lenguaje de programación específico. Entre los ejemplos cabe destacar los archivos .wsdl (lenguaje de descubrimiento de servicios Web) y los archivos de esquema XML (.xsd). ASP.NET puede compilar estos archivos en ensamblados.

La carpeta App_Code puede contener todos los archivos y subcarpetas que necesite. Puede organizar el código fuente de la forma que crea más conveniente, ya que ASP.NET lo compilará en un solo ensamblado al que podrá tener acceso el código de cualquier parte de la aplicación Web.

Deducir el lenguaje de programación de la carpeta App_Code

El contenido de la carpeta App_Code no se marca explícitamente como escrito en un lenguaje de programación concreto. ASP.NET deduce el compilador que se debe invocar para la carpeta App_Code basándose en los archivos que contiene. Si la carpeta App_Code contiene archivos .vb, ASP.NET utiliza el compilador de Visual Basic; si contiene archivos .cs, el compilador de C#, etc.

Si la carpeta App_Code contiene sólo archivos cuyo lenguaje de programación es ambiguo, como un archivo .wsdl, ASP.NET utilizará el compilador predeterminado para aplicaciones Web, tal como viene configurado en el elemento compilation de la aplicación Web o en el archivo de configuración del equipo.

Varios lenguajes de programación en la carpeta App_Code

Puesto que el código fuente de la carpeta App_Code se compila en un solo ensamblado, todos los archivos de esta carpeta deben estar escritos en el mismo lenguaje de programación. Por ejemplo, la carpeta App_Code no puede incluir código fuente escrito en Visual Basic y C#.

Sin embargo, es posible configurar la aplicación Web para tratar las subcarpetas de la carpeta App_Code como unidades compilables separadas. Cada carpeta puede contener código fuente de un lenguaje de programación diferente. La configuración se especifica creando un elemento codeSubDirectories en el elemento compilation del archivo Web.config y agregando una referencia a la subcarpeta. En el ejemplo siguiente se muestra la configuración de las subcarpetas denominadas VBCode y CSCode para compilar en ensamblados separados:

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

Tenga en cuenta que las referencias a las subcarpetas VBCode y CSCode no incluyen ninguna información sobre el lenguaje de programación que contiene la subcarpeta. Como en el caso de la propia carpeta App_Code, ASP.NET deduce el compilador que se va a utilizar basándose en los archivos de la subcarpeta.

Seguridad de la carpeta App_Code

Los problemas de seguridad relacionados con el código de la carpeta App_Code son básicamente los mismos que los del código de la carpeta Bin (el código se compila en un ensamblado en tiempo de ejecución). Un factor atenuante es que el código de los archivos de la carpeta App_Code se puede leer. Sin embargo, si no se entiende el código, puede seguir comprometiendo la seguridad. Por consiguiente, trate el código fuente de la carpeta App_Code como si se tratara de código compilado procedente del mismo origen.

Vea también

Conceptos

Diseño de sitios Web ASP.NET