Могу ли я получить & # 8220; файл WAR & # 8221; тип развертывания с ASP.NET?
-
03-07-2019 - |
Вопрос
Иногда люди, разбирающиеся в J2EE, смотрят на ASP.NET и задаются вопросом: где поддержка развертывания приложения как единого модуля ? Приложения JSP / Servlet могут быть развернуты в виде файлов WAR со всеми страницами, содержимым, метаданными и кодом в одном архиве. Военный файл может быть версионным, легко перемещаться. Есть гарантия, что все приложение содержится в одном блоке. Р>
Это не основной подход для ASP.NET. Что делают люди? Они прибегают к копированию каталогов и всех бесчисленных файлов? Разве это не проблема для разработчиков ASP.NET? Р>
(это своего рода обман, потому что я собираюсь предложить свой ответ)
Решение
Хотя это не основной подход в 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 или ... ??
Другие советы
Частью решения являются встроенные ресурсы . Это заботится обо всех статических файлах.
Часть решения использует Проект веб-развертывания , объединяющий все страницы (т.е. веб-сайт без возможности обновления) в одну сборку. Это позаботится обо всех файлах .cs.
Таким образом, в каталоге остается DLL-файл, поддерживающий DLL-файлы и файлы-заглушки ASPX. IIS по умолчанию хочет, чтобы файл aspx существовал до того, как он попытается его сервер, следовательно, заглушка.