2017-05-10 996 views
21

我有一个相当简单的C#WebAPI2项目,本地运行但在远程计算机(Windows Server 2012 R2 Standard)上发布到IIS后,网页显示以下内容(将customErrors设置为“Off” ):IIS编译错误-2146232576 AspNetInitializationExceptionModule

Server Error in '/' Application. Compilation Error Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately. Compiler Error Message: The compiler failed with error code -2146232576.

如果我抢了detailed compiler output和IIS服务器上运行它,我得到一个smartscreen error message说:

This app can't run on your PC. To find a version for your PC, check with the software publisher.

我猜这是什么做的编译器版本,但什么事都没有自从它改变了上次发布。

任何想法?

+0

好的,所以事情变成了**。 Newtonsoft.Json软件包在我没有意识到的情况下进行了更新和签入,似乎将项目的目标框架从4. – feganmeister

+1

提升到了.NET 4.5.2,这也可能是由Microsoft.CodeDom.Providers.DotNetCompilerPlatform引起的。 'Microsoft.Net.Compilers包'删除它们,然后重新部署并观察您的问题消失:P –

回答

7

目标框架已更改,必须在Windows Server上安装.NET 4.6。

17

错误:

Compilation Error

Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.

Compiler Error Message: The compiler failed with error code -2146232576.

解决方法:

我面临这个问题升级后一些NuGets并通过下面的步骤来解决。

步骤1:NuGet Package Console移除这些的NuGet包

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

步骤2:后:在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.data>标记之前添加这些system.codedom线同时,我们删除了<system.codedom> comp letely,为固定的其他错误。

+3

删除Codedome也为我做了这个诀窍。我的项目是4.5.2,但试图使用它。我不会编译任何编码,因此可以删除 – Juan

+1

删除Nugets和web.config行解决了Azure经典云服务中的相同问题 – cdiazal

+0

什么是您的Roslyn编译器版本?如果您使用的是Roslyn编译器2.0+,则需要在服务器上安装.net framework 4.6+。 – mattfei

10

罪魁祸首是Microsoft.Net.Compilers包,用于在您的项目中支持现代C#语法/功能(版本6.0,7.0),特别是在Razor视图中。根据其版本的不同,该软件包需要在相关机器上安装安装的完整.NET框架的特定最低版本。

例如,2.2.0包需要.NET 4.6+。即使你的项目的目标是.NET 4.5.2,你可能在你的开发机器上安装了最新的.NET,而且一切都很顺利。远程部署机器只安装了.NET 4.5.2,当您的ASP.NET应用程序尝试在运行时编译资源(例如视图)时,您会收到错误-2146232576

您的选择:

  1. 如果您确实需要使用新望C#功能在您的项目 - 安装最新的.NET Framework到远程计算机。

  2. 如果您对仅提供更多或更少的现代C#功能感到满意 - 将Microsoft.Net.Compilers软件包降级为仅需要您的远程机器上的框架的版本。例如,版本1.3.2只需要.NET 4.5。

  3. 如果你并不需要在所有上述功能,只需从你的项目中删除Microsoft.Net.CompilersMicrosoft.CodeDom.Providers.DotNetCompilerPlatform(罗斯林CodeDom中提供)封装。

0

对我来说,这是因为我试图为我的类的属性Authorize的Roles属性创建一个字符串。

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

我必须建立不同的字符串,只是设置一个常数角色:

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

其中

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

希望这有助于任何人说的技巧自理下来这个洞。

0

我帮只是删除的NuGet包以上:

Microsoft.CodeDom.Providers.DotNetCompilerPlatform 

Microsoft.Net.Compilers

重新编译,然后将它们重新添加。