关于c#:IIS编译错误-2146232576 AspNetInitializationExceptionModule

IIS Compilation Error -2146232576 AspNetInitializationExceptionModule

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

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.

如果获取详细的编译器输出并在IIS服务器上运行它,则会收到一条智能屏幕错误消息,内容为:

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

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

有任何想法吗?


错误:

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.

解:

升级某些NuGet后,我遇到了此问题,并通过以下步骤解决了。

步骤1:从NuGet Package Console删除这些NuGet程序包

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

步骤2:在关闭Web.config中的标记之前添加这些system.codedom

1
2
3
4
5
6
    <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:过了一会儿,我们彻底删除了,以修复其他错误。


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

例如,2.2.0软件包需要.NET 4.6+。即使您的项目针对的是.NET 4.5.2,您也可能已在开发计算机上安装了最新的.NET,并且一切正常。远程部署计算机仅安装了.NET 4.5.2,并且当您的ASP.NET应用程序尝试在运行时编译资源(例如视图)时,您会收到错误-2146232576

您的选择:

  • 如果您绝对需要在项目中使用新的C#功能,请在远程计算机上安装最新的.NET框架。

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

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


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


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

    1
    Microsoft.CodeDom.Providers.DotNetCompilerPlatform

    Microsoft.Net.Compilers

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


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


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


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


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

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

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

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

    哪里

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

    希望这可以帮助任何欺骗自己的人。