IIS编译错误-2146232576 AspNetInitializationExceptionModule

时间:2017-05-10 12:41:58

标签: c# asp.net-web-api2 iis-8

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

  '/'应用程序中的服务器错误。   编译错误   描述:编译所需资源期间发生错误    服务这个请求。请查看以下特定错误详细信息并相应地修改源代码。   编译器错误消息:编译器失败,错误代码为-2146232576。

如果我抓住detailed compiler output并在IIS服务器上运行它,我会得到一个smartscreen error message说:

  

此应用无法在您的PC上运行。要查找适用于您的PC的版本,请与软件发行商联系。

我猜它与编译器版本有关,但自上次发布以来没有任何变化。

有什么想法吗?

9 个答案:

答案 0 :(得分:25)

错误:

  

编译错误

     

描述:编译资源期间发生错误   需要为此请求提供服务。请查看以下具体内容   错误详细信息并适当修改源代码。

     

编译器错误消息:编译器失败并显示错误代码   -2146232576。

解决方案:

我升级了一些NuGets后遇到了这个问题,并通过以下步骤解决了。

第1步:NuGet Package Console

中删除这些NuGet包
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>,以修复其他错误。

答案 1 :(得分:23)

罪魁祸首是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框架安装到远程计算机上。

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

  3. 如果您根本不需要上述功能,只需从项目中删除Microsoft.Net.CompilersMicrosoft.CodeDom.Providers.DotNetCompilerPlatform(Roslyn CodeDom提供程序)包。

答案 2 :(得分:9)

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

答案 3 :(得分:2)

对我来说只是删除了上面的NuGet包:

Microsoft.CodeDom.Providers.DotNetCompilerPlatform

Microsoft.Net.Compilers

重新编译,然后重新添加。

答案 4 :(得分:0)

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

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

我必须构建不同的字符串,并将一个常量设置为Roles:

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

其中

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

希望这可以帮助那些欺骗自己的人。

答案 5 :(得分:0)

我将.NET框架升级到4.6版,并且可以正常工作。 Roslyn软件包依赖于4.5+版本,但是它不起作用。因此,升级使其能够正常工作。

答案 6 :(得分:0)

我将NuGet软件包“ Microsoft.CodeDom.Providers.DotNetCompilerPlatform”从2.0.0升级到了2.0.1,并为我解决了此问题

答案 7 :(得分:0)

对我来说,通过让服务器的其他用户再次发布该应用程序,解决了类似的问题。每次发布该应用程序时,都依赖于其他用户不存在的临时ASP.NET文件夹。我希望这会有所帮助。

答案 8 :(得分:0)

我知道的最好方法是在PC上安装.net framework 4.7。