Ошибка компиляции IIS -2146232576 AspNetInitializationExceptionModule
У меня довольно простой проект С# WebAPI2, который выполняется локально, но после публикации в IIS на удаленном компьютере (Windows Server 2012 R2 Standard) веб-страница отображает следующее (после установки customErrors на "Off" ):
Ошибка сервера в приложении "/". Ошибка компиляции Описание. Произошла ошибка во время компиляции ресурса, необходимого для обслуживать этот запрос. Ознакомьтесь с приведенными ниже конкретными данными об ошибках и соответствующим образом измените исходный код. Сообщение об ошибке компилятора: сбой компилятора с кодом ошибки -2146232576.
Если я возьму подробный вывод компилятора и запустил его на сервере IIS, я получаю сообщение об ошибке smartscreen:
Это приложение не может работать на вашем ПК. Чтобы найти версию для вашего ПК, обратитесь к издателю программного обеспечения.
Я предполагаю, что это связано с версией компилятора, но с момента последнего опубликования ничего не изменилось.
Любые идеи?
Ответы
Ответ 1
Ошибка:
Ошибка компиляции
Описание: Произошла ошибка во время компиляции ресурса требуется для обслуживания этого запроса. Ознакомьтесь со следующими конкретными детали ошибок и соответствующим образом изменить исходный код.
Сообщение об ошибке компилятора: сбой компилятора с кодом ошибки -2146232576.
Решение:
Я столкнулся с этой проблемой после обновления некоторых NuGets и решил с помощью следующих шагов.
Шаг 1: Удалите эти пакеты NuGet с NuGet Package Console
PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
PM> Uninstall-package Microsoft.Net.Compilers
Шаг 2: Добавьте эти строки system.codedom
перед закрытием тега </system.data>
в Web.config
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"></compiler>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+"></compiler>
</compilers>
</system.codedom>
PS: Через некоторое время мы удалили <system.codedom>
полностью, для исправления других ошибок.
Ответ 2
Преступник - это пакет Microsoft.Net.Compilers
, используемый для поддержки современных синтаксисов и функций С# (версия 6.0, 7.0) в вашем проекте и, в частности, в представлениях Razor. В зависимости от его версии пакет требует определенной минимальной версии полной платформы .NET для установки на рассматриваемой машине.
Например, для пакета 2.2.0 требуется .NET 4.6+. Несмотря на то, что ваш проект нацелен на использование .NET 4.5.2, у вас, вероятно, есть последняя версия .NET, установленная на вашей машине разработки, и все идет отлично. На удаленном компьютере для развертывания установлен только .NET 4.5.2, и когда приложение ASP.NET пытается скомпилировать ресурс (например, представления) во время выполнения, вы получаете сообщение об ошибке -2146232576
.
Ваши варианты:
-
Если вам абсолютно необходимо использовать новые возможности С# в вашем проекте, установите последнюю платформу .NET на удаленную машину.
-
Если вы довольны доступными более или менее современными функциями С#, перейдите на пакет Microsoft.Net.Compilers к версии, для которой требуется только фреймворк, который у вас есть на вашем удаленном компьютере. Например, для версии 1.3.2 требуется только .NET 4.5.
-
Если вам вообще не нужны указанные функции, просто удалите пакеты Microsoft.Net.Compilers
и Microsoft.CodeDom.Providers.DotNetCompilerPlatform
(поставщики Roslyn CodeDom) из вашего проекта.
Ответ 3
Целевая структура была изменена, ей пришлось установить .NET 4.6 на Windows Server.
Ответ 4
для меня помогло просто удалить пакеты NuGet выше:
Microsoft.CodeDom.Providers.DotNetCompilerPlatform
Microsoft.Net.Compilers
Перекомпилируйте, а затем добавьте их обратно.
Ответ 5
Для меня это было потому, что я попытался создать строку для свойства Roles атрибута Authorize в моем классе.
[Authorize(Roles = IdentityRoles.Administrator + "," + IdentityRoles.BaseData)]
Мне пришлось строить разные строки и просто устанавливать одну константу в роли:
[Authorize(Roles = IdentityRoles.AutorizationStrings.AdminBaseData)]
где
IdentityRoles.AutorizationStrings.AdminBaseData = "Administrator,Base data";
Надеюсь, это поможет любому, кто обманывает себя в этой дыре.
Ответ 6
Я обновил .NET Framework до версии 4.6, и это сработало. Пакеты Roslyn зависят от версий 4. 5+, но это не сработало. Таким образом, обновление заставило его работать.
Ответ 7
Я обновил пакет NuGet "Microsoft.CodeDom.Providers.DotNetCompilerPlatform" с 2.0.0 до 2.0.1, и это решает эту проблему для меня
Ответ 8
Для меня аналогичная проблема была решена, позволив другому пользователю сервера снова опубликовать приложение. Каждый раз, когда я публиковал приложение, оно зависело от временной папки ASP.NET, которая не существует для другого пользователя. Надеюсь, это поможет.