Pergunta

Às vezes, as pessoas que conhecem J2ee olham para asp.net e admiram, onde está o suporte para implantar um aplicativo como uma única unidade? Os aplicativos JSP/Servlet podem ser implantados como arquivos de guerra, com todas as páginas, conteúdo, metadados e codificam esse único arquivo. O arquivo de guerra pode ser versado, facilmente movido. Há uma garantia de que todo o aplicativo está contido em uma única unidade.

Essa não é uma abordagem convencional para asp.net. O que as pessoas fazem? Eles recorrem a copiando diretórios e todos os inúmeros arquivos? Isso não é um problema para os desenvolvedores do ASP.NET?

(Isso é uma espécie de trapaça, porque vou sugerir minha própria resposta)

Foi útil?

Solução

Embora não seja uma abordagem convencional no ASP.NET, isso é muito possível, usando um construto chamado VirtualPathProvider para asp.net. Com ele, você pode servir o conteúdo do site a partir de coisas que não são o sistema de arquivos. Por um exemplo, você pode servir um site ASP.NET diretamente fora de um arquivo zip, sem descompactar os arquivos no disco, primeiro.

Aqui está um download Isso demonstra ou ilustra o conceito, usando a biblioteca dotnetzip para ajudar o ASP.net a retirar o conteúdo do zip.

Os bits de código interessantes:

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;
        }
    }
}

O construto VPP funciona com o ASP.NET 2.0 ou posterior, funciona com qualquer site. É claro que você pode adaptar a idéia de fonte de conteúdo de um banco de dados, um CMS ou ... ??

Outras dicas

Parte da solução é Recursos incorporados. Isso cuida de todos os arquivos estáticos.

Parte da solução é usar um Projeto de implantação da Web, compilando todas as páginas (ou seja, site não atualizado) em uma única montagem. Isso cuida de todos os arquivos .CS.

Portanto, o que resta é um .dll no bin, suportando arquivos .dll e os arquivos .aspx stob. Por padrão, o IIS deseja que o arquivo ASPX exista antes de tentar servir -o, daí o stub.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top