سؤال

في بعض الأحيان، J2EE والدهاء الناس ينظرون إلى ASP.NET وعجب، <م> أين الدعم لنشر التطبيق كوحدة واحدة ؟ يمكن نشر التطبيقات JSP / بريمج كملفات WAR، مع كل الصفحات، والمحتوى، الفوقية، ورمز في ذلك أرشيف واحد. يمكن تعيين إصدار ملف الحرب، بسهولة نقلها من مكان. هناك تأكيدا بأن يرد التطبيق بأكمله في وحدة واحدة.

وهذا ليس نهج التيار الرئيسي للASP.NET. ماذا يفعل الناس؟ أنها لا تلجأ إلى نسخ الدلائل وكافة الملفات لا تعد ولا تحصى؟ هل هذا فقط لا مشكلة لمطوري ASP.NET؟

و(هذا هو نوع من الغش، لأنني ذاهب لاقتراح إجابة بلدي)

هل كانت مفيدة؟

المحلول

وعلى الرغم من عدم نهج السائد في ASP.NET، وهذا ممكن جدا، وذلك باستخدام بناء يسمى VirtualPathProvider لASP.NET. مع ذلك، يمكنك تخدم محتوى الموقع من الأشياء التي ليست نظام الملفات. على سبيل المثال واحد، هل يمكن أن تخدم موقع ASP.NET مباشرة من ملف ZIP، دون حيويي الملفات إلى القرص أولا.

هنا هو تحميل الذي يوضح أو يبين مفهوم، وذلك باستخدام مكتبة DotNetZip لمساعدة ASP.NET في سحب المحتوى من الرمز البريدي.

وبت كود مثيرة للاهتمام:

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

ووVPP بناء يعمل مع ASP.NET 2.0 أو في وقت لاحق، ويعمل مع أي موقع. يمكنك بالطبع التكيف مع فكرة لمصدر المحتوى من قاعدة البيانات، وCMS، أو ... ؟؟

نصائح أخرى

وجزء من الحل هو الموارد جزءا لا يتجزأ من . أن يرعى جميع الملفات الثابتة.

وجزء من الحل يستخدم <لأ href = "http://www.microsoft.com/downloads/details.aspx؟familyId=0AA30AE8-C73B-4BDD-BB1B-FE697256C459&displaylang=en" يختلط = "نوفولو noreferrer "> مشروع نشر على شبكة الإنترنت ، وتجميع كل الصفحات (أي الموقع لا-قابلة للتحديث) في جمعية واحدة. أن يرعى جميع الملفات .cs.

وهكذا ما تبقى هو ملف .dll في بن ودعم الملفات وملفات aspx كعب. DLL. IIS افتراضيا يريد ملف ASPX في الوجود قبل أن يحاول الخادم عنه، وبالتالي كعب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top