Могу ли я получить развертывание типа "WAR-файл" с ASP.NET? - PullRequest
5 голосов
/ 06 марта 2009

Иногда люди, разбирающиеся в J2EE, смотрят на ASP.NET и задаются вопросом, где поддержка развертывания приложения как единого блока ? Приложения JSP / Servlet могут быть развернуты в виде файлов WAR со всеми страницами, содержимым, метаданными и кодом в одном архиве. Военный файл может быть версионным, легко перемещаться. Есть гарантия, что все приложение содержится в одном блоке.

Это не основной подход для ASP.NET. Что делают люди? Они прибегают к копированию каталогов и всех бесчисленных файлов? Разве это не проблема для разработчиков ASP.NET?

(это своего рода обман, потому что я собираюсь предложить свой ответ)

Ответы [ 2 ]

5 голосов
/ 06 марта 2009

Хотя это не основной подход в ASP.NET, это очень возможно, используя конструкцию, называемую VirtualPathProvider для ASP.NET. С его помощью вы можете обслуживать содержимое веб-сайта из вещей, которые не являются файловой системой. Например, вы можете обслуживать веб-сайт ASP.NET непосредственно из ZIP-файла, не разархивируя файлы на диск.

Вот загрузка , которая демонстрирует или иллюстрирует концепцию, используя библиотеку DotNetZip для помощи ASP.NET в извлечении контента из zip.

Интересные биты кода:

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 или ... ??

3 голосов
/ 10 мая 2009

Часть решения - встроенные ресурсы . Это заботится обо всех статических файлах.

Часть решения использует проект веб-развертывания , объединяющий все страницы (то есть веб-сайт без возможности обновления) в одну сборку. Это позаботится обо всех файлах .cs.

Таким образом, остается .dll в bin, поддерживающий .dll-файлы и .aspx заглушки. IIS по умолчанию хочет, чтобы файл aspx существовал до того, как он попытается его сервировать, следовательно, заглушка.

...