Domanda

A volte le persone esperte di J2EE guardano ASP.NET e si chiedono, dov'è il supporto per la distribuzione di un'app come una singola unità ? Le app JSP / Servlet possono essere distribuite come file WAR, con tutte le pagine, i contenuti, i metadati e il codice in quel singolo archivio. Il file di guerra può essere aggiornato, spostato facilmente. C'è la certezza che l'intera app sia contenuta in una singola unità.

Questo non è un approccio tradizionale per ASP.NET. Cosa fanno le persone? Ricorrono alla copia di directory e di tutti i miriadi di file? Questo non è solo un problema per gli sviluppatori ASP.NET?

(questa è una specie di imbroglione, perché ho intenzione di suggerire la mia risposta)

È stato utile?

Soluzione

Sebbene non sia un approccio tradizionale in ASP.NET, questo è molto possibile, usando un costrutto chiamato VirtualPathProvider per ASP.NET. Con esso, puoi servire il contenuto del sito Web da cose che non sono il filesystem. Ad esempio, potresti servire un sito Web ASP.NET direttamente da un file ZIP, senza decomprimere prima i file sul disco.

Ecco un download che dimostra o illustra il concetto, utilizzando la libreria DotNetZip per aiutare ASP.NET a estrarre il contenuto dalla zip.

I bit di codice interessanti:

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

Il costrutto VPP funziona con ASP.NET 2.0 o versioni successive, funziona con qualsiasi sito Web. Ovviamente puoi adattare l'idea al contenuto di origine da un database, un CMS o ... ??

Altri suggerimenti

Parte della soluzione è risorse incorporate . Questo si occupa di tutti i file statici.

Parte della soluzione sta utilizzando un progetto di distribuzione web , compilando tutte le pagine (ovvero il sito Web non aggiornabile) in un unico assembly. Questo si occupa di tutti i file .cs.

Quindi ciò che rimane è un .dll nel cestino, che supporta i file .dll e i file stub .aspx. Per impostazione predefinita, IIS desidera che il file aspx esista prima di tentare di eseguirne il server, quindi lo stub.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top