Могу ли я получить развертывание типа файла WAR с помощью ASP.NET?

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

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

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


person Cheeso    schedule 06.03.2009    source источник
comment
Когда я впервые начал делать asp.net, я не мог поверить, что у них нет военной модели развертывания. Военное развертывание имеет смысл, тогда как развертывание, возможно, сотен файлов, необходимых для сайта asp.net, просто смешно.   -  person dustyburwell    schedule 10.05.2009


Ответы (2)


Хотя это не является распространенным подходом в 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 или ... ??

person Cheeso    schedule 06.03.2009
comment
Чтобы упростить развертывание сайта. Всего один файл. удобная контрольная сумма для проверки. и Т. Д. - person Cheeso; 11.05.2009
comment
Мой единственный комментарий касается производительности, провайдер zip-файлов должен изначально распаковать файл в теневую папку asp.net. Не видя фактического кода, возможно, он уже это делает. Таким образом, реальное снижение производительности происходит только при переработке пула приложений, где (теоретически) придется перепроверить зависимости, чтобы определить, нужно ли снова распаковать. - person enorl76; 12.03.2012
comment
@ enorl76 - ZipVirtualFile не распаковывает файл. Он не записывает в файловую систему. Он открывает только читаемый поток, который распаковывается по мере чтения. Сам ASPNET будет читать этот поток, и я не знаю, что он делает с читаемым контентом, но это зависит от ASPNET. - person Cheeso; 13.03.2012

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

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

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

person MatthewMartin    schedule 10.05.2009