Web Deploy API - 部署 .NET 4.5 应用程序

12

我们正在使用几乎未经记录的 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是一种“原地”升级,用新版本号.30319替换了4.0 DLL)。

通过添加/p:VisualStudioVersion=11.0标志(导致使用不同的Web应用程序目标文件,以某种方式允许部署.NET 4.5应用程序),可以通过MSBuild.exe命令行(而不是创建包,而是直接同步到服务器)解决此问题。

是否有人知道为什么Web Deploy API会出现这样的问题,以及如何像MSBuild解决方案一样解决此错误?


你好,Matt,我们将研究这份报告。如果需要在我们这边复现问题的小项目,我会让你知道。问候,Varun(.NET Framework 兼容性) - Varun
2个回答

11
最简单的方法可能就是将 Microsoft.Web.Publishing.targets 中的 IgnoreDeployManagedRuntimeVersion 属性包含在 .csproj 中,或者在 /t:package 步骤期间作为 MSBuild 的参数。其他选项可能是在项目根目录中使用 parameters.xml 使 managedRuntimeVersion 可以被 MSDeploy 参数覆盖,或者在 archive.xml 中直接设置它作为预部署步骤。请注意,保留 HTML 标签。

嗯,这比VS 2012本身的操作更不像是黑客行为。从VS进行IIS发布(Web Deploy选项),将生成的包是temp文件夹和参数xml的内容,而不是通用打包时得到的zip文件,运行时版本将被设置为4,即使项目是4.5。IgnoreDeployManagedRuntimeVersion将完全省略它。如果您从VS选择Web Deploy Package选项,则会获得带有4.5的archive.xml的zip文件,如果您尝试手动将VS输出的zip文件直接导入IIS,则会出现错误弹出窗口,其中4.0与4.5应用程序池错误相同,与从命令行运行msbuild /t:package和msdeploy:sync时得到的错误相同。VS(devenv)没有做对,它悄悄地覆盖了项目设置,而不是MSDeploy的问题,因为版本是在编译/打包(MSBuild/devenv)期间设置的,而不是在部署期间设置的。

顺便说一句,关于API文档,它们几乎不存在,但我发现命令行文档还可以接受(称为Web Deploy而不是MSDeploy,例如http://technet.microsoft.com/en-us/library/dd569089.aspx和其他),将其与dotPeek输出进行心理映射可以有所帮助。

这是我们已经完成的工作,只是为了让构建正常运行 - 但这并不是真正的修复,对吧?更像是一种抑制错误的黑客行为。 - harman_kardon
简而言之:是的,这并不理想,但与VS本身所做的并没有太大区别。 - Ilya Kozhevnikov
感谢您进一步调查此事 - 您提到的关于VS 2012处理此问题的方式很有趣。我也会等待原始帖子评论者的进一步调查结果。谢谢! - harman_kardon
1
FYI,刚刚注意到Microsoft.Web.Publishing.targets中还有一些属性会影响archive.xml中的managedRuntimeVersion,即DeployDefaultTargetFrameworkVersion(默认为$(TargetFrameworkVersion),在.csproj中设置为v4.5)和DeployManagedRuntimeVersion为空,将它们之一设置为4应该也可以在t:Package期间起作用。 - Ilya Kozhevnikov

4
您可以尝试将以下内容添加到您的项目中:
<IgnoreDeployManagedRuntimeVersion>True</IgnoreDeployManagedRuntimeVersion>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接