如何在asp.net部署脚本中包含应用程序池规范?

时间:2014-06-17 22:02:50

标签: asp.net iis msbuild webdeploy

我有一个MSBuild脚本,它为我的网络应用程序生成部署脚本。

Project.build (摘录)

<MSBuild Projects="xxxxx.sln" Properties="
                CreatePackageOnPublish=true;
                DeployOnBuild=true;
                IncludeIisSettings=true;
                IncludeAppPool=true;" >
  <Output TaskParameter="TargetOutputs" ItemName="CompiledAssembly" />
</MSBuild>

执行此操作时,它会在输出中生成一个Package文件夹,其中包含部署.cmd文件和关联的.zip文件。

xxxx.SetParameters.xml (生成)

<?xml version="1.0" encoding="utf-8"?>
<parameters>
  <setParameter name="IIS Web Application Name" value="Default Web Site\xxxxx" />
  <setParameter name="DefaultConnection-Web.config Connection String" 
         value=" ... snipped ..." />
</parameters>

如您所见,此处没有对应用池的引用。同样,在生成的xxxx.zip \ parameters.xml

中提到了app pool

执行xxxxxx.deploy.cmd /Y时,它会在IIS中正确创建应用程序。问题是,它似乎使用了机器的默认应用程序池。这是一个.net 4应用程序,因此如果默认为.net 2,则该应用程序无法运行。

是否有办法让部署脚本包含应用程序池定义,以便不需要手动更改应用程序池?

我确实发现this question,似乎是一样的。但是,正如您所看到的,我已经包含了该问题的答案,并且没有任何效果。

1 个答案:

答案 0 :(得分:3)

如果您尝试将4.0应用程序部署到2.0默认应用程序池而不提供覆盖,它将无法运行但无法部署,MSDeploy将无法预先创建ERROR_APPPOOL_VERSION_MISMATCH错误的虚拟应用程序

IncludeAppPool是正确的属性,但它只告诉打包者包含设置,您必须提供源,即“主”虚拟应用程序以及要从中复制的正确应用程序池。

打开项目属性并从IIS Express切换到Local IIS,这将在包/发布选项下启用应用程序池标记。我相信您可以在之后切换回来,设置将保留。

enter image description here

enter image description here

这基本上可以做两件事,添加<IncludeAppPool>true</IncludeAppPool>以及在<WebProjectProperties>部分下添加主应用。现在,当您构建或打包源清单时,不会有managedRuntimeVersion要求,但您的参数现在将自定义IIS Web Application Pool Name

如果你想真正创建一个新的应用程序池,那么它会变得棘手。我不知道在创建iisApp期间或使用某些MSBuild标志创建它的方法,但是使用MSDeploy(.cmd后面的工具)它将需要转储本地池并同步使用appPoolConfig提供程序,可能是.build调用之前.cmd脚本的一部分。

msdeploy -verb:sync -source:appPoolConfig=Foo -dest:package=foo.zip
msdeploy -verb:sync -source:package=foo.zip -dest:appPoolConfig=Foo,computerName=Bar

请记住,如果没有指定单独的appPoolConfig,同步应该会破坏其他池,所以首先请-whatIf以防万一。

你可以尝试将你的软件包的archive.xmlarchive.xml与应用程序池定义合并,但我无法想象它是如何工作的以及iisApp之间的关系那里有appPoolConfig个提供者。

修改:您可以使用manifest providerpackageiisAppappPoolConfig

结合使用