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?
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.
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=\"Web\" /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:
Si vous devez absolument utiliser les nouvelles fonctionnalités C # dans votre projet, installez le dernier framework .NET sur la machine distante.
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.
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.
La structure cible a été modifiée, il fallait installer .NET 4.6 sur Windows Server.
pour moi, il suffit de supprimer les paquets NuGet ci-dessus:
Microsoft.CodeDom.Providers.DotNetCompilerPlatform
Microsoft.Net.Compilers
Recompilez puis rajoutez-les.
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.
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é.