web-dev-qa-db-fra.com

IIS Erreur de compilation -2146232576 AspNetInitializationExceptionModule

J'ai un projet C # WebAPI2 assez simple qui s'exécute localement mais après la publication sur IIS sur un ordinateur distant (Windows Server 2012 R2 Standard), la page Web affiche les éléments suivants (après avoir défini customErrors sur "Désactivé"):

Erreur serveur dans l'application. Erreur de compilation Description: une erreur s'est produite lors de la compilation d'une ressource requise pour traiter cette demande. Veuillez vérifier les détails d'erreur spécifiques suivants et modifier votre code source de manière appropriée . Message d'erreur du compilateur: Le compilateur a échoué avec le code d'erreur -2146232576.

Si je récupère la sortie du compilateur détaillé et l'exécute sur le serveur IIS, je reçois un message d'erreur smartscreen disant:

Cette application ne peut pas fonctionner sur votre PC. Pour trouver une version pour votre PC, contactez l'éditeur du logiciel.

Je suppose que cela a quelque chose à voir avec la version du compilateur mais rien n'a changé depuis sa dernière publication.

Des idées?

23
feganmeister

Erreur:

Erreur de compilation

Description: une erreur s’est produite lors de la compilation d’une ressource nécessaire pour répondre à cette demande. S'il vous plaît examiner le spécifique suivant détails de l'erreur et modifiez votre code source de manière appropriée. 

Message d'erreur du compilateur: Le compilateur a échoué avec le code d'erreur -2146232576.

Solution:

J'ai fait face à ce problème après la mise à niveau de certains NuGets et résolu avec les étapes ci-dessous.

Étape 1: Supprimez ces paquets NuGet de NuGet Package Console

PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
PM> Uninstall-package Microsoft.Net.Compilers

Étape 2: Ajoutez ces lignes system.codedom avant de fermer la balise </system.data> dans 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: Après un moment, nous avons complètement supprimé <system.codedom>, pour corriger d’autres erreurs.

Le coupable est le paquetage Microsoft.Net.Compilers, utilisé pour prendre en charge la syntaxe/les fonctionnalités C # modernes (version 6.0, 7.0) dans votre projet et dans les vues Razor en particulier. En fonction de sa version, le package nécessite qu'une version minimale particulière du framework .NET complet soit installéeinstall sur un ordinateur en question.

Par exemple, le package 2.2.0 nécessite .NET 4.6+. Même si votre projet cible .NET 4.5.2, vous avez probablement la dernière version .NET installée sur votre ordinateur de développement, et tout se passe bien. .NET 4.5.2 est uniquement installé sur la machine de déploiement à distance et lorsque votre application ASP.NET tente de compiler une ressource (par exemple, des vues) au moment de l'exécution, vous obtenez l'erreur -2146232576.

Vos options:

  1. Si vous devez absolument utiliser les nouvelles fonctionnalités C # dans votre projet, installez le dernier framework .NET sur la machine distante.

  2. Si vous êtes satisfait de la disponibilité de fonctionnalités C # plus ou moins modernes, rétrogradez le package Microsoft.Net.Compilers à une version ne nécessitant qu'un framework existant sur votre ordinateur distant. Par exemple, la version 1.3.2 nécessite uniquement .NET 4.5.

  3. Si vous n'avez pas du tout besoin desdites fonctionnalités, supprimez simplement les packages Microsoft.Net.Compilers et Microsoft.CodeDom.Providers.DotNetCompilerPlatform (fournisseurs Roslyn CodeDom) de votre projet.

21
Roman Pletnev

La structure cible a été modifiée, il fallait installer .NET 4.6 sur Windows Server.

9
feganmeister

pour moi, il suffit de supprimer les paquets NuGet ci-dessus:

Microsoft.CodeDom.Providers.DotNetCompilerPlatform

Microsoft.Net.Compilers

Recompilez puis rajoutez-les.

2
Bladeus

Pour moi, c’est parce que j’ai essayé de construire une chaîne pour la propriété Roles de l’attribut Authorize sur ma classe. 

[Authorize(Roles = IdentityRoles.Administrator + "," + IdentityRoles.BaseData)]

Je devais construire les différentes chaînes et définir une constante pour les rôles:

[Authorize(Roles = IdentityRoles.AutorizationStrings.AdminBaseData)]

où 

IdentityRoles.AutorizationStrings.AdminBaseData = "Administrator,Base data";

J'espère que cela aidera quiconque se trompe dans ce trou. 

0
ekblom

J'ai mis à niveau le framework .NET vers la version 4.6 et cela a fonctionné. Les packages Roslyn dépendent des versions 4.5+, mais cela n'a pas fonctionné. Donc, la mise à niveau a fonctionné. 

0
LeleGaurav