Подтвердить что ты не робот

Ошибка компиляции IIS -2146232576 AspNetInitializationExceptionModule

У меня довольно простой проект С# WebAPI2, который выполняется локально, но после публикации в IIS на удаленном компьютере (Windows Server 2012 R2 Standard) веб-страница отображает следующее (после установки customErrors на "Off" ):

Ошибка сервера в приложении "/". Ошибка компиляции Описание. Произошла ошибка во время компиляции ресурса, необходимого для  обслуживать этот запрос. Ознакомьтесь с приведенными ниже конкретными данными об ошибках и соответствующим образом измените исходный код. Сообщение об ошибке компилятора: сбой компилятора с кодом ошибки -2146232576.

Если я возьму подробный вывод компилятора и запустил его на сервере IIS, я получаю сообщение об ошибке smartscreen:

Это приложение не может работать на вашем ПК. Чтобы найти версию для вашего ПК, обратитесь к издателю программного обеспечения.

Я предполагаю, что это связано с версией компилятора, но с момента последнего опубликования ничего не изменилось.

Любые идеи?

4b9b3361

Ответ 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=\&quot;Web\&quot; /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, которая не существует для другого пользователя. Надеюсь, это поможет.