【问题标题】:Can I get "WAR file" type deployment with ASP.NET?我可以使用 ASP.NET 获得“WAR 文件”类型的部署吗?
【发布时间】:2010-10-11 19:21:38
【问题描述】:

有时精通 J2EE 的人看着 ASP.NET 并想知道,将应用程序部署为单个单元的支持在哪里? JSP/Servlet 应用程序可以部署为 WAR 文件,所有页面、内容、元数据和代码都在一个存档中。战争文件可以进行版本控制,轻松移动。可以保证整个应用程序包含在一个单元中。

这不是 ASP.NET 的主流方法。人们做什么?他们是否求助于复制目录和所有无数文件?这对 ASP.NET 开发人员来说不是问题吗?

(这有点作弊,因为我会建议我自己的答案)

【问题讨论】:

  • 当我第一次开始做 asp.net 时,我不敢相信他们没有类似战争的部署模型。战争部署是完全有意义的,而部署一个 asp.net 站点可能需要的数百个文件是荒谬的。

标签: .net asp.net deployment archive


【解决方案1】:

虽然不是 ASP.NET 中的主流方法,但这很有可能,使用 ASP.NET 的称为 VirtualPathProvider 的构造。有了它,您可以从非文件系统的东西中提供网站内容。例如,您可以直接从 ZIP 文件中提供 ASP.NET 网站,而无需先将文件解压缩到磁盘。

Here's a download 演示或说明概念,使用 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 或...中获取内容??

【讨论】:

  • 使站点部署更简单。只有一个文件。用于验证的简单校验和。等
  • 我唯一的评论是为了性能,zip 文件提供程序最初应该将文件解压缩到 asp.net 影子文件夹中。在没有看到实际代码的情况下,它可能已经这样做了。那么你唯一真正的性能损失是应用程序池回收,它(理论上)必须重新检查依赖关系以确定它是否需要再次解压缩。
  • @enorl76 - ZipVirtualFile 不解压缩文件。它不写入文件系统。它只打开一个在读取时解压缩的可读流。 ASPNET 本身会读取该流,我不知道它对读取的内容做了什么,但这取决于 ASPNET。
【解决方案2】:

部分解决方案是embedded resources。这会处理所有的静态文件。

部分解决方案是使用web deployment project,将所有页面(即网站不可更新)编译到一个程序集中。这会处理所有的 .cs 文件。

所以剩下的是 bin 中的 .dll,支持 .dll 文件和 .aspx 存根文件。默认情况下,IIS 希望 aspx 文件在它尝试服务器之前存在,因此是存根。

【讨论】:

    猜你喜欢
    • 2013-08-30
    • 1970-01-01
    • 2023-04-07
    • 2017-09-24
    • 2017-10-07
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多