5 Stimmen

Kann ich eine Bereitstellung vom Typ "WAR-Datei" mit ASP.NET erhalten?

Manchmal schauen J2EE-erfahrene Leute auf ASP.NET und fragen sich, Wo ist die Unterstützung für die Bereitstellung einer Anwendung als einzelne Einheit? ? JSP/Servlet-Anwendungen können als WAR-Dateien bereitgestellt werden, mit allen Seiten, Inhalten, Metadaten und Code in einem einzigen Archiv. Die WAR-Datei kann versioniert und leicht verschoben werden. Es besteht die Gewissheit, dass die gesamte Anwendung in einer einzigen Einheit enthalten ist.

Das ist kein gängiger Ansatz für ASP.NET. Was machen die Leute dann? Kopieren sie Verzeichnisse und all die unzähligen Dateien? Ist dies einfach kein Problem für ASP.NET-Entwickler?

(dies ist eine Art Betrug, denn ich werde meine eigene Antwort vorschlagen)

5voto

Cheeso Punkte 184210

Obwohl dies kein gängiger Ansatz in ASP.NET ist, ist dies sehr wohl möglich, indem man ein Konstrukt namens VirtualPathProvider für ASP.NET. Damit können Sie Website-Inhalte aus Dingen bereitstellen, die nicht das Dateisystem sind. So können Sie zum Beispiel eine ASP.NET-Website direkt aus einer ZIP-Datei bereitstellen, ohne die Dateien vorher auf der Festplatte zu entpacken.

Hier ist ein Download das das Konzept demonstriert oder veranschaulicht, indem es die DotNetZip-Bibliothek verwendet, um ASP.NET beim Herausziehen von Inhalten aus der Zip-Datei zu unterstützen.

Die interessanten Code-Bits:

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

Das VPP-Konstrukt funktioniert mit ASP.NET 2.0 oder höher, funktioniert mit jeder Website. Sie können die Idee natürlich anpassen, um Inhalte aus einer Datenbank, einem CMS oder ... zu beziehen.

3voto

MatthewMartin Punkte 31018

Ein Teil der Lösung ist eingebettete Ressourcen . Damit sind alle statischen Dateien abgedeckt.

Ein Teil der Lösung ist die Verwendung eines Web-Entwicklungsprojekt und kompiliert alle Seiten (d. h. die nicht aktualisierbare Website) in eine einzige Assembly. Damit sind alle .cs-Dateien erledigt.

Was also übrig bleibt, ist eine .dll in bin, unterstützende .dll-Dateien und die .aspx-Stub-Dateien. IIS standardmäßig will die aspx-Datei zu existieren, bevor es versucht, es auf dem Server, daher der Stub.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X