我们正在使用Web Deploy 3的(几乎完整的未公开的)'公共API'来创建我们网站的.zip包,然后将其同步到服务器:
DeploymentBaseOptions destinationOptions = new DeploymentBaseOptions()
{
UserName = //username,
Password = //password,
ComputerName = //a server
};
using (var deploymentObject = DeploymentManager.CreateObject(DeploymentWellKnownProvider.Package, "C:/MyWebsitePackage.zip"))
{
deploymentObject.SyncParameters.Load(packageParametersFile); \\ contains some connection string information and nothing more.
DeploymentSyncOptions syncOptions = new DeploymentSyncOptions();
syncOptions.WhatIf = false;
deploymentObject.SyncTo(destinationOptions, syncOptions);
}
这段代码完美无缺,直到我们在 生产环境 和构建服务器上安装.NET 4.5并将我们部署的项目升级到4.5 . 现在我们收到以下错误:
您尝试使用的应用程序池将“managedRuntimeVersion”属性设置为“v4.0” . 此应用程序需要'v4.5' . 有关详情,请访问:http://go.microsoft.com/fwlink/?LinkId = 221672 #ERROR_APPPOOL_VERSION_MISMATCH .
我们的服务器肯定安装了.Net 4.5,而且IIS网站应用程序池版本是'.NET Framework v4.0.30319'(我知道它说v4但是.NET 4.5是'就地'升级并用以下内容替换4.0 DLL新版本号.30319) .
通过添加/p:VisualStudioVersion=11.0标志(导致使用不同的Web应用程序目标文件),可以通过MSBuild.exe命令行进行部署(不是通过创建程序包,而是通过直接同步到服务器) resolve this issue 以某种方式允许部署.NET 4.5应用程序) .
有谁知道为什么Web Deploy API会这样抱怨,以及我如何以与MSBuild解决方案相同的方式解决此错误?
2 回答
最简单的可能只是将Microsoft.Web.Publishing.targets中的IgnoreDeployManagedRuntimeVersion属性包含到.csproj中,或者在/ t:package步骤中将其作为MSBuild的参数 . 其他选项可能是项目根目录中的parameters.xml,以使managedRuntimeVersion可以使用MSDeploy参数进行覆盖,或者直接在archive.xml中的.zip中将其设置为预部署步骤 .
更新(太长时间无法回复评论):
嗯,它不像VS 2012本身那么糟糕 . 从VS(Web部署选项)发布到IIS并且它将生成的包将是临时文件夹和参数xml的内容,而不是在执行通用打包时获得的zip,并且将设置运行时版本到4即使项目是4.5 . IgnoreDeployManagedRuntimeVersion只是完全省略它 . 如果您从VS执行Web Deploy Package选项,您将在archive.xml中获得4.5的zip,如果您尝试直接手动将VS输出的zip导入IIS,您将获得4.0 vs 4.5 app pool的错误弹出窗口错误,与从运行msbuild / t:package和msdeploy:从命令行同步获得的错误相同 . VS(devenv)没有做到“正确”,它会悄悄地覆盖项目设置,并且不是MSDeploy的错,因为在编译/打包期间(MSBuild / devenv)在部署期间没有设置版本 .
顺便说一句,重新API文档,是的,它们实际上是不存在的,但我发现命令行文档是可以容忍的(称为Web Deploy而不是MSDeploy,例如http://technet.microsoft.com/en-us/library/dd569089.aspx和其他),并且精神上将它们映射到dotPeek输出有点帮助 .
您可以尝试将其添加到项目中: