“ WARファイル”を取得できますかASP.NETを使用したタイプの展開?
-
03-07-2019 - |
質問
J2EEに精通した人がASP.NETを見て、単一のユニットとしてアプリを展開するためのサポートはどこにあるのでしょうか? JSP /サーブレットアプリは、すべてのページ、コンテンツ、メタデータ、コードをその単一のアーカイブに格納したWARファイルとしてデプロイできます。 warファイルはバージョン管理でき、簡単に移動できます。アプリ全体が単一のユニットに含まれているという保証があります。
これはASP.NETの主流のアプローチではありません。人々は何をしますか?ディレクトリとすべての無数のファイルをコピーすることに頼っていますか?これは単にASP.NET開発者にとって問題ではないのでしょうか?
(これはごまかしです。自分の答えを提案するからです)
解決
ASP.NETでは主流のアプローチではありませんが、ASP.NETの VirtualPathProvider
と呼ばれる構造を使用して、これは非常に可能です。これにより、ファイルシステムではないものからWebサイトのコンテンツを提供できます。たとえば、最初にファイルをディスクに解凍せずに、ZIPファイルから直接ASP.NET Webサイトを提供できます。
ダウンロードまたはデモを示す 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以降で動作し、どのWebサイトでも動作します。もちろん、データベース、CMS、または...からソースコンテンツにアイデアを適応させることができますか??
他のヒント
ソリューションの一部は、埋め込みリソースです。これですべての静的ファイルが処理されます。
ソリューションの一部は、ウェブ展開プロジェクト、すべてのページ(つまり、ウェブサイトは更新不可)を単一のアセンブリにコンパイルします。これですべての.csファイルが処理されます。
つまり、残っているのは、.dllファイルと.aspxスタブファイルをサポートする.dllのビンです。 IISはデフォルトで、aspxファイルがサーバーに接続する前に存在することを望んでいるため、スタブです。