У меня возникли трудности с публикацией нового, пустого проекта ASP.NET Web API 2, работающего на .NET 4.8.
В активно разрабатываемом проекте того же типа я обнаружил, что, хотя проект собирается успешно, его нельзя опубликовать. После долгих исследований и анализа настроек и опций я сузил круг вопросов до этой конкретной проблемы, которую можно последовательно воспроизвести в новом пустом проекте веб-API.
(Я не могу вставлять изображения, поэтому мне приходится использовать ссылки для скриншотов.)
Если я создаю новое решение , новый проект веб-приложения asp.net, снимите флажок «Настроить для https» и выберите веб-API в качестве типа веб-приложения, и попытайтесь опубликовать в локальную папку, используя публикацию по умолчанию. настройки работают должным образом, и после копирования опубликованных файлов на сервер IIS в моей сети загружается домашняя страница по умолчанию.
Однако, если я устанавливаю целевую платформу Debug and Release Platform для проектов на x64 и пытаюсь опубликовать, Visual Studio утверждает, что публикация прошла успешно, но если я скопирую опубликованные файлы на свой сервер IIS и перейду к URL-адресу проекта, Я получаю следующую ошибку (я понимаю, что когда я делал скриншоты, был выбран режим отладки, но при повторном выполнении этого действия в Release возникают идентичные ошибки).
Server Error in '/' Application.
Could not load file or assembly 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version 4.1.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference.
(Exception from HRESULT: 0x80131040)
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.IO.FileLoadException: Could not load file or assembly 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)]dependencies. The located assembly's manifest
definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Assembly Load Trace: The following information can be helpful to determine why the assembly 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' could not be loaded.
WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion! EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion! EnableLog].
Stack Trace:
[FileLoadException: Could not load file or assembly 'Microsoft.CodeDom. Providers.DotNetCompilerPlatform, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or
System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type) +0
System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName) +100
System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) +47
System.Type.GetType(String typeName) +42
System.CodeDom.Compiler.Compiler Info.get_IsCodeDomProvider TypeValid() +13
System.Web.Compilation. Compilation Util.GetRecompilationHash (Compilation Section ps) +2915
System.Web.Configuration.CompilationSection.get_RecompilationHash() +93
System.Web.Compilation.BuildManager. CheckTopLevelFiles UpToDate Internal (Int64 cachedHash) +548
System.Web.Compilation.BuildManager. CheckTopLevelFiles UpToDate (Int64 cachedHash) +57
System.Web.Compilation.BuildManager. ExecutePreAppStart() +150
System.Web.Hosting. HostingEnvironment. Initialize (ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +854
[HttpException (0x80004005): Could not load file or assembly 'Microsoft.CodeDom. Providers.DotNetCompilerPlatform, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)]
System.Web.HttpRuntime. FirstRequestInit(HttpContext context) +532
System.Web.HttpRuntime. Ensure FirstRequestInit(HttpContext context) +114
System.Web.HttpRuntime. Process Request Notification Private (IIS7Worker Request wr, HttpContext context) +724
Version Information: Microsoft .NET Framework Version: 4.0.30319; ASP.NET Version: 4.8.4110.0
Я не уверен, повлияет ли это на потенциальное решение, но моя организация требует, чтобы настройки публикации были следующими: (Предварительная компиляция во время публикации, запрет обновления предварительно скомпилированного сайта и объединение вывода отдельных папок в собственную сборку )
Если я изменю свои настройки публикации на эти, публикация завершится с ошибкой с той же ошибкой, но теперь в Visual Studio.
Publish has encountered an error.
Build failed. Check the Output window for more details.
A diagnostic log has been written to the following location:
"C:\Users\username\AppData\Local\Temp\tmp2090.tmp"
Содержимое файла журнала:
6/18/2024 3:12:17 PM
System.AggregateException: One or more errors occurred. ---> Microsoft.WebTools.Shared.Exceptions.WebToolsException: Build failed. Check the Output window for more details.
--- End of inner exception stack trace ---
---> (Inner Exception #0) Microsoft.WebTools.Shared.Exceptions.WebToolsException: Build failed. Check the Output window for more details.<---
Microsoft.WebTools.Shared.Exceptions.WebToolsException: Build failed. Check the Output window for more details.
===================
Содержимое окна вывода:
Description:
Could not load file or assembly 'WebApplication4' or one of its dependencies. An attempt was made
to load a program with an incorrect format.
Project:
WebApplication4
File:
ASPNETCOMPILER
Line:
0
Другой ранее существовавший 64-битный проект webapi, созданный несколько месяцев назад, сегодня успешно публикуется, но при проверке файлов csproj они почти идентичны, с той лишь разницей, что справочные записи перечислены в несколько разных местах в самом файле .csproj. Даже в этом рабочем, доступном для публикации решении, если создается новый пустой проект webapi, он отображает ту же ошибку при публикации в локальной папке в последних версиях Visual Studio 2017 и 2022, работающих в последней сборке Windows 10 Pro. х64.
В других проектах библиотека, в которой возникает ошибка, меняется в зависимости от того, какие пакеты nuget или ссылки на проекты включены. Ошибка возникает только при одной зависимости для каждой публикации. Если есть какие-либо ссылки на проект, например, на библиотеку классов или несколько дополнительных пакетов nuget, вместо этого возникнет ошибка одного из них.
Я пробовал следующее:
Обновление всех пакетов nuget и оставление их как есть в новом проекте, но ничего не работает.
Перезагружаю компьютер и перезапускаю Visual Studio.
Изменение разрядности IIS на x64 в настройках проекта
Я провел столько исследований, сколько мог, но получаю результаты только для конфликтов 32-битных/64-битных библиотек, которые могут иметь место, но, насколько мне удалось увидеть все настройки, и каждая библиотека является 64-битной.
Удаление всех ссылок <assemblyBinding>
в моем web.config и запуск Get-Project -All | Add-BindingRedirect
в консоли диспетчера пакетов Visual Studio.
Путь к моему решению имеет длину всего 108 символов, поэтому это не проблема со слишком длинным путем.
Создал новый проект на нескольких разных компьютерах (не виртуальных машинах), а также использовал Visual Studio 2017, но это все равно не сработало. По какой-то причине в других ранее существовавших проектах этой проблемы нет, только в новых.
На момент публикации у меня установлена последняя версия Visual Studio Professional 2022 (64-разрядная версия) 17.10.3, а также на момент публикации я использую последнюю версию Windows 11 Pro версии 10.0.22631, сборка 22631.
Решение найдено. Оказывается, путь компилятора .Net не изменится с 32-битного, если вы измените Target Target на 64-битную.
Сначала щелкните проект правой кнопкой мыши в обозревателе решений и выберите «Выгрузить проект», затем один раз щелкните проект, чтобы просмотреть XML-файл его .csproj, затем в тегах ProperyGroup добавьте эту строку (в будущем откорректируйте ее в соответствии с текущей версией компилятора). ):
<AspnetCompilerPath>$(windir)\Microsoft.NET\Framework64\v4.0.30319</AspnetCompilerPath>
Таким образом, конечный результат вашего файла .csproj должен выглядеть примерно так (единственные строки, которые должны быть абсолютно одинаковыми, — это AspnetCompilerPath и PlatformTarget):
<PropertyGroup Condition = " '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<AspnetCompilerPath>$(windir)\Microsoft.NET\Framework64\v4.0.30319</AspnetCompilerPath>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition = " '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<AspnetCompilerPath>$(windir)\Microsoft.NET\Framework64\v4.0.30319</AspnetCompilerPath>
<DebugSymbols>true</DebugSymbols>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
Затем сохраните файл, щелкните правой кнопкой мыши проект в обозревателе решений и выберите «Обновить проект с зависимостями».
Для справки: поскольку эта строка не генерируется Visual Studio, чтобы заставить компилятор быть 32-битным, измените путь к ней (изменив номер версии на ту, которая у вас есть):
<AspnetCompilerPath>$(windir)\Microsoft.NET\Framework\v4.0.30319</AspnetCompilerPath>
Чтобы найти номера версий, которые поддерживает ваша установка Visual Studio, вы можете просто перейти к C:\Windows\Microsoft.NET
в проводнике (или туда, где находится ваш $(windir)
) и посмотреть, какие версии установлены. Выбор не должен быть большим.