Visual Studio を使用してパッケージを作成しました。
次に、それをサーバーにコピーし、そのパッケージをローカルに展開します (これを行う C# プログラムがあります。コードは以下にあります)。
パッケージの V2 を変更してビルドします。デプロイすると、InvalidDataException が発生します (以下の完全なスタック)。
その他の詳細:
OS サーバー2008 R2
パッケージがインストーラーに入れられたときにのみ発生します。ローカルでビルドして実行するだけで、毎回動作します。
インストーラーによって配置された zip ファイルは、最初は正常に機能するため、デプロイされたファイルを削除してから再実行することで、この問題を回避できます。
私はWebDeploy v2を使用しています(ただし、v1でもこの問題がありました)
エラー スタック:
Error: System.IO.InvalidDataException: Found invalid data while decoding.
at System.IO.Compression.Inflater.DecodeDynamicBlockHeader()
at System.IO.Compression.Inflater.Decode()
at System.IO.Compression.Inflater.Inflate(Byte[] bytes, Int32 offset, Int32 length)
at System.IO.Compression.DeflateStream.Read(Byte[] array, Int32 offset, Int32 count)
at Microsoft.Web.Deployment.SerializationHelper.CopyStream(Stream sourceStream, Stream destStream, Byte[] buffer)
at Microsoft.Web.Deployment.FilePathProvider.Add(DeploymentObject source, Boolean whatIf)
at Microsoft.Web.Deployment.DeploymentObject.Update(DeploymentObject source, DeploymentSyncContext syncContext)
at Microsoft.Web.Deployment.DeploymentSyncContext.HandleUpdate(DeploymentObject destObject, DeploymentObject sourceObject)
at Microsoft.Web.Deployment.DeploymentSyncContext.SyncDirPathChildren(DeploymentObject destRoot, DeploymentObject sourceRoot)
at Microsoft.Web.Deployment.DeploymentSyncContext.SyncDirPathChildren(DeploymentObject destRoot, DeploymentObject sourceRoot)
at Microsoft.Web.Deployment.DeploymentSyncContext.SyncChildrenNoOrder(DeploymentObject dest, DeploymentObject source)
at Microsoft.Web.Deployment.DeploymentSyncContext.SyncChildrenNoOrder(DeploymentObject dest, DeploymentObject source)
at Microsoft.Web.Deployment.DeploymentSyncContext.SyncChildrenOrder(DeploymentObject dest, DeploymentObject source)
at Microsoft.Web.Deployment.DeploymentSyncContext.ProcessSync(DeploymentObject destinationObject, DeploymentObject sourceObject)
at Microsoft.Web.Deployment.DeploymentObject.SyncToInternal(DeploymentObject destObject, DeploymentSyncOptions syncOptions, PayloadTable payloadTable, ContentRootTable contentRootTable)
at Microsoft.Web.Deployment.DeploymentObject.SyncTo(DeploymentProviderOptions providerOptions, DeploymentBaseOptions baseOptions, DeploymentSyncOptions syncOptions)
私のプログラムが行っていること (抽出および要約):
_syncOptions = new DeploymentSyncOptions() {DeleteDestination = false,DoNotDelete = false};
_sourceBaseOptions = new DeploymentBaseOptions();
_destBaseOptions = new DeploymentBaseOptions
{
TraceLevel = TraceLevel.Verbose,
};
var appDeploymentObject = DeploymentManager.CreateObject(DeploymentWellKnownProvider.Package,
applicationPackage,
_sourceBaseOptions);
DeploymentRule rule = null;
if (_syncOptions.Rules.TryGetValue("IISConfigFrom64To32", out rule))
{
_syncOptions.Rules.Remove("IISConfigFrom64To32");
}
var summary = DeploymentObject.SyncTo(destBaseOptions, _syncOptions);