Pregunta

En ocasiones, las personas con conocimientos de J2EE ven ASP.NET y se preguntan, ¿dónde está el soporte para implementar una aplicación como una sola unidad ? Las aplicaciones JSP / Servlet se pueden implementar como archivos WAR, con todas las páginas, contenido, metadatos y código en ese único archivo. El archivo war puede ser versionado, fácilmente movido. Existe la seguridad de que toda la aplicación está contenida en una sola unidad.

Eso no es un enfoque general para ASP.NET. ¿Que hace la gente? ¿Recurren a copiar directorios y todos los miles de archivos? ¿Esto no es un problema para los desarrolladores de ASP.NET?

(esto es una especie de trampa, porque voy a sugerir mi propia respuesta)

¿Fue útil?

Solución

Aunque no es un enfoque general en ASP.NET, esto es muy posible, utilizando una construcción llamada VirtualPathProvider para ASP.NET. Con él, puede servir el contenido del sitio web de cosas que no son el sistema de archivos. Por ejemplo, podría servir un sitio web ASP.NET directamente desde un archivo ZIP, sin descomprimir primero los archivos en el disco.

Aquí hay una descarga que demuestra o ilustra El concepto, usando la biblioteca DotNetZip para ayudar a ASP.NET a sacar contenido del zip.

Los bits de código interesantes:

using Ionic.Zip;

namespace Ionic.Zip.Web.VirtualPathProvider
{
    public class ZipFileVirtualPathProvider : System.Web.Hosting.VirtualPathProvider
    {
        ZipFile _zipFile;

        public ZipFileVirtualPathProvider (string zipFilename)
            : base () {
            _zipFile =  ZipFile.Read(zipFilename);
        }

        ~ZipFileVirtualPathProvider () {
            _zipFile.Dispose ();
        }

        public override bool FileExists (string virtualPath)
        {
            string zipPath = Util.ConvertVirtualPathToZipPath (virtualPath, true);
            ZipEntry zipEntry = _zipFile[zipPath];

            if (zipEntry != null)
            {
                return !zipEntry.IsDirectory;
            }
            else
            {
                // Here you may want to return Previous.FileExists(virtualPath) instead of false
                // if you want to give the previously registered provider a process to serve the file
                return false;
            }
        }

        public override bool DirectoryExists (string virtualDir)
        {
            string zipPath = Util.ConvertVirtualPathToZipPath (virtualDir, false);
            ZipEntry zipEntry = _zipFile[zipPath];

            if (zipEntry != null)
            {
                return zipEntry.IsDirectory;
            }
            else
            {
                // Here you may want to return Previous.DirectoryExists(virtualDir) instead of false
                // if you want to give the previously registered provider a chance to process the directory
                return false;
            }
        }

        public override VirtualFile GetFile (string virtualPath) {
            return new ZipVirtualFile (virtualPath, _zipFile);
        }

        public override VirtualDirectory GetDirectory (string virtualDir)
        {
            return new ZipVirtualDirectory (virtualDir, _zipFile);
        }

        public override string GetFileHash(string virtualPath, System.Collections.IEnumerable virtualPathDependencies)
        {
            return null;
        }

        public override System.Web.Caching.CacheDependency GetCacheDependency(String virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
        {
            return null;
        }
    }
}

La construcción VPP funciona con ASP.NET 2.0 o posterior, funciona con cualquier sitio web. Por supuesto, puede adaptar la idea al origen de contenido de una base de datos, un CMS o ... ??

Otros consejos

Parte de la solución es recursos integrados . Eso se encarga de todos los archivos estáticos.

Parte de la solución es usar un proyecto de implementación web , que compila todas las páginas (es decir, el sitio web no actualizable) en un único ensamblaje. Eso se encarga de todos los archivos .cs.

Entonces, lo que queda es un .dll en bin, que admite archivos .dll y los archivos de código auxiliar .aspx. IIS por defecto quiere que el archivo aspx exista antes de que intente guardarlo, de ahí el código auxiliar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top