c# - publicar - Error de compilación de IIS-2146232576 AspNetInitializationExceptionModule
web api c# (6)
Tengo un proyecto C # WebAPI2 bastante simple que se ejecuta localmente, pero después de publicar en IIS en una máquina remota (Windows Server 2012 R2 Standard), la página web muestra lo siguiente (después de configurar customErrors en "Off"):
Error del servidor en la aplicación ''/''. Descripción del error de compilación: se produjo un error durante la compilación de un recurso requerido para atender esta solicitud. Por favor revise los siguientes detalles de error específicos y modifique su código fuente apropiadamente. Mensaje de error del compilador: el compilador falló con el código de error -2146232576.
Si tomo el resultado detallado del compilador y lo ejecuto en el servidor IIS, aparece un mensaje de error en pantalla inteligente que dice:
Esta aplicación no puede ejecutarse en tu PC. Para encontrar una versión para su PC, consulte con el editor del software.
Supongo que es algo que ver con la versión del compilador, pero nada ha cambiado desde que se publicó por última vez.
¿Algunas ideas?
Error:
error de compilación
Descripción: se produjo un error durante la compilación de un recurso requerido para atender esta solicitud. Por favor revise los siguientes detalles de error específicos y modifique su código fuente apropiadamente.
Mensaje de error del compilador: el compilador falló con el código de error -2146232576.
Solución:
Enfrenté este problema después de actualizar algunos NuGets y lo resolví con los pasos a continuación.
Paso 1: eliminar estos paquetes de NuGet Package Console
de paquetes de NuGet Package Console
PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
PM> Uninstall-package Microsoft.Net.Compilers
Paso 2: agregue estas líneas system.codedom
antes de cerrar la etiqueta </system.data>
en 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: Después de un tiempo, eliminamos por completo <system.codedom>
, para corregir otros errores.
Actualicé el framework .NET a la versión 4.6 y funcionó. Los paquetes de Roslyn dependen de las versiones 4.5+, pero no funcionó. Así que la actualización lo hizo funcionar.
El culpable es el paquete Microsoft.Net.Compilers
, que se usa para admitir la sintaxis / características modernas de C # (versión 6.0, 7.0) en su proyecto y en las vistas de Razor en particular. Dependiendo de su versión, el paquete requiere una versión mínima particular de .NET Framework completo para instalarse en una máquina en cuestión.
Por ejemplo, el paquete 2.2.0 requiere .NET 4.6+. A pesar de que su proyecto está dirigido a .NET 4.5.2, probablemente tenga instalado el último .NET en su máquina de desarrollo, y todo va bien. La máquina de implementación remota solo tiene .NET 4.5.2 instalado, y cuando su aplicación ASP.NET intenta compilar recursos (por ejemplo, vistas) en tiempo de ejecución, obtiene el error -2146232576
.
Sus opciones:
Si absolutamente necesita usar las nuevas funciones de C # en su proyecto, instale el último .NET Framework en la máquina remota.
Si está satisfecho con la disponibilidad de más o menos funciones modernas de C #, actualice el paquete Microsoft.Net.Compilers a una versión que solo requiera un marco de trabajo que tenga en su máquina remota. Por ejemplo, la versión 1.3.2 solo necesita .NET 4.5.
Si no necesita las funciones mencionadas, simplemente elimine
Microsoft.Net.Compilers
paquetes deMicrosoft.Net.Compilers
yMicrosoft.CodeDom.Providers.DotNetCompilerPlatform
(proveedores de Roslyn CodeDom) de su proyecto.
Para mí, ayudé simplemente a eliminar los paquetes NuGet anteriores:
Microsoft.CodeDom.Providers.DotNetCompilerPlatform
Microsoft.Net.Compilers
Recompila y vuelve a añadirlos.
Para mí, fue porque intenté crear una cadena para la propiedad Roles del atributo Autorizar en mi clase.
[Authorize(Roles = IdentityRoles.Administrator + "," + IdentityRoles.BaseData)]
Tuve que construir las diferentes cadenas y solo establecer una constante en Roles:
[Authorize(Roles = IdentityRoles.AutorizationStrings.AdminBaseData)]
dónde
IdentityRoles.AutorizationStrings.AdminBaseData = "Administrator,Base data";
Espero que esto ayude a cualquiera que se engañe por este agujero.
Se cambió el marco de destino, se tuvo que instalar .NET 4.6 en el servidor de Windows.