API Web Deploy - развертывание приложения .NET 4.5

Мы используем общедоступный API (почти полный недокументированный) для Web Deploy 3, чтобы создать пакет .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).

решить эту проблему при развертывании через командную строку MSBuild.exe(не путем создания пакета, а путем синхронизации непосредственно с сервером), добавив флаг /p:VisualStudioVersion=11.0 ( который вызывает использование другого целевого файла целевого веб-приложения, который каким-то образом позволяет развертывать приложение .NET 4.5).

Кто-нибудь знает, почему API веб-развертывания так жалуется и как я могу разрешить эту ошибку так же, как решение MSBuild?

Ответ 1

Самый простой, возможно, будет просто включать свойство IgnoreDeployManagedRuntimeVersion из Microsoft.Web.Publishing.targets в .csproj или как параметр для MSBuild во время /t: шаг пакета. Другим вариантом может быть параметр .xml в корне проекта, чтобы сделать managedRuntimeVersion переписываемым с параметрами MSDeploy или установить его непосредственно в .zip в файле archive.xml как шаг до развертывания.

Обновить (слишком долго, чтобы ответить как комментарий):

Ну, это меньше взлома, чем то, что делает VS 2012. Опубликовать в IIS из VS (параметр веб-развертывания) и пакет, который он будет генерировать, будет являться содержимым папки temp и параметров xml, а не zip, которую вы получаете при создании общей упаковки, и версии исполнения, которая будет установлена до 4, хотя проект составляет 4,5. IgnoreDeployManagedRuntimeVersion просто полностью опустит его. Если вы делаете опцию Web Deploy Package из VS, вы получите zip с 4.5 в файле archive.xml, и если вы попытаетесь вручную импортировать ZIP файл, выданный VS, в IIS напрямую, вы получите всплывающее окно с 4.0 с 4.5 пулом приложений ошибка, аналогичная той, которую вы получаете от запуска msbuild/t: package и msdeploy: sync из командной строки. VS (devenv) не делает это "правильно", он спокойно перезаписывает настройку проекта, и это не ошибка MSDeploy, поскольку версия установлена ​​во время компиляции/упаковки (MSBuild/devenv) не во время развертывания.

Кстати, re API docs, да, они практически отсутствуют, но я считаю допустимыми допустимые документы в командной строке (называемые Web Deploy not MSDeploy, например http://technet.microsoft.com/en-us/library/dd569089.aspx и т.д.) и мысленно отображать их для вывода dotPeek немного помогает.

Ответ 2

Вы можете попробовать добавить это в свой проект:

<IgnoreDeployManagedRuntimeVersion>True</IgnoreDeployManagedRuntimeVersion>