5

J2EE に精通した人々は、ASP.NET を見て、アプリケーションを単一のユニットとして展開するためのサポートはどこにあるのか疑問に思うことがあります。JSP/サーブレット アプリは、すべてのページ、コンテンツ、メタデータ、およびコードを 1 つのアーカイブに格納して、WAR ファイルとしてデプロイできます。war ファイルはバージョン管理でき、簡単に移動できます。アプリ全体が 1 つのユニットに含まれているという保証があります。

これは、ASP.NET の主流のアプローチではありません。人々は何をしますか?ディレクトリと無数のファイルすべてをコピーすることに頼っていますか? これは ASP.NET 開発者にとって問題ではないのでしょうか?

(私は自分の答えを提案するつもりなので、これは一種のチートです)

4

2 に答える 2

5

ASP.NET の主流のアプローチではありませんが、VirtualPathProviderfor ASP.NET と呼ばれる構造を使用すると、これは非常に可能です。これにより、ファイルシステム以外のものから Web サイトのコンテンツを提供できます。たとえば、最初にファイルをディスクに解凍せずに、ZIP ファイルから直接 ASP.NET Web サイトを提供できます。

これは、ASP.NET が zip からコンテンツを取得するのを支援する DotNetZip ライブラリを使用して、概念を実証または説明するダウンロードです。

興味深いコード ビット:

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 以降で動作し、あらゆる Web サイトで動作します。もちろん、このアイデアをデータベース、CMS、または ... ?? からコンテンツを取得するように適応させることもできます。

于 2009-03-06T17:37:40.583 に答える
3

ソリューションの一部は組み込みリソースです。これですべての静的ファイルが処理されます。

ソリューションの一部は、Web展開プロジェクトを使用して、すべてのページ(つまり、Webサイトを更新できない)を単一のアセンブリにコンパイルすることです。これですべての.csファイルが処理されます。

したがって、残っているのはbin内の.dllであり、.dllファイルと.aspxスタブファイルをサポートしています。IISはデフォルトで、サーバーを起動する前にaspxファイルが存在することを望んでいるため、スタブになります。

于 2009-05-10T03:21:26.610 に答える