CKFinder Zip 安装 CodeDom 提供程序类型异常

问题描述

根据 ckfinder 文档,尝试通过 ZIP 下载选项将 CkFinder 作为子站点安装到 ASP.NET MVC Web 应用程序。主MVC站点运行正常,但由于所需库中的版本信息冲突,无法通过nuget添加CKFinder。

沙盒测试涉及将 ckfinder 作为子站点添加到 ASP.NET webforms 应用程序中,该应用程序似乎可以立即完美运行,只有几个配置问题。

现在,我将子站点添加到 MVC 应用程序的“区域”之一,这导致了我稍后将描述的相同异常。将路径更改为推荐的 /ckfinder 路径并没有真正产生影响。安装完所有内容后,我转到 ckfinder 路径并获得丑陋的 ASP.NET 错误页面,如果我转到 ckfinder 示例页面,丑陋的错误显示在弹出窗口中。在事件查看器中,记录了此异常:

Exception information: 
    Exception type: HttpException 
    Exception message: The CodeDom provider type "Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider,Microsoft.CodeDom.Providers.DotNetCompilerPlatform,Version=2.0.1.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35" Could not be located. (C:\webs\MainSite\web.config line 369)
   at System.Web.Compilation.BuildManager.ReportTopLevelCompilationException()
   at System.Web.Compilation.BuildManager.EnsuretopLevelFilesCompiled()
   at System.Web.Compilation.BuildManager.CallAppInitializeMethod()
   at System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager,IApplicationHost appHost,IConfigMapPathFactory configMapPathFactory,HostingEnvironmentParameters hostingParameters,PolicyLevel policyLevel,Exception appDomainCreationException)

The CodeDom provider type "Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider,PublicKeyToken=31bf3856ad364e35" Could not be located. (C:\webs\MainSite\web.config line 369)
   at System.CodeDom.Compiler.CompilerInfo.get_CodeDomProviderType()
   at System.Web.Configuration.CompilationSection.GetCompilerInfoFromExtension(String extension,Boolean throwOnFail)
   at System.Web.Compilation.CompilationUtil.GetbuildproviderTypeFromExtension(CompilationSection config,String extension,buildproviderAppliesTo neededFor,Boolean failIfUnkNown)
   at System.Web.Compilation.BuildManager.Createbuildprovider(VirtualPath virtualPath,CompilationSection compConfig,ICollection referencedAssemblies,Boolean failIfUnkNown)
   at System.Web.Compilation.CodeDirectoryCompiler.ProcessDirectoryRecursive(VirtualDirectory vdir,Boolean topLevel)
   at System.Web.Compilation.CodeDirectoryCompiler.GetCodeDirectoryAssembly(VirtualPath virtualDir,CodeDirectoryType dirType,String assemblyName,StringSet excludedSubdirectories,Boolean isDirectoryAllowed)
   at System.Web.Compilation.BuildManager.CompileCodeDirectory(VirtualPath virtualDir,StringSet excludedSubdirectories)
   at System.Web.Compilation.BuildManager.CompileCodeDirectories()
   at System.Web.Compilation.BuildManager.EnsuretopLevelFilesCompiled()

站点的 web.config 文件中引用了 codedom 库,但 ckeditor 站点未引用它们。

所以它看起来像在尝试从主站点查找 roslyn 库的异常中,正如我所说,ckFinder 安装为子站点。这两个站点实际上甚至没有安装在服务器的同一个磁盘上。

** 更新 **

我从父应用程序中删除了 roslyn(ASP.NET 4.6.2、MVC 中的一个单独的独立解决方案),现在 CKFinder 可以工作了。但是,删除 roslyn/codedom 包似乎破坏了其他功能

即我收到新错误

Error   CS8026  Feature 'null propagating operator' is not available in C# 5. Please use language version 6 or greater.

这个错误似乎很奇怪,因为微软说我应该至少运行 C# 7.3 和 Visual Studio 2019 和 .NET 版本 4.6.2。该项目在高级配置中显示 C# 版本的“最新版本”。

解决方法

因为带有 CKFinder 的文件夹(从 IIS 的角度来看)托管在主应用程序的文件夹中,所以它继承了主应用程序 web.config 文件中的所有设置。

这包括编译器提供程序的设置。所以,由于主应用程序的web.config被应用到CKFinder项目中,所以在CKFinder项目执行时会搜索编译器提供程序程序集,但找不到。我看到了四种不同的方法:

1 合并为一个项目

实际上将 CKFinder 的东西合并到您的主应用程序中,这样您就只有一个 Visual Studio Web 项目

2 作为兄弟姐妹主持

将它们作为服务器上的同级托管,而不是在另一个内托管(即 http://localhost/MainApp/ 上的主应用程序和 http://localhost/ckfinder/ 上的 CKFinder 项目)或使用不同的子域。

3 将编译器添加到 CKFinder 应用程序

在 Visual Studio 中打开 CKFinder 子站点文件夹并添加 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 版本 2.0.1 nuget 包,以便搜索到的程序集编译器提供程序程序集也存在于 CKFinder 应用程序中,并且可以在那里找到。

4 防止主应用将编译器选项应用到子应用

通过将 system.codedom 节点嵌入 location 节点,修改主应用程序的 web.config,以便编译器提供程序设置不会传递给子应用程序:

<location path="." inheritInChildApplications="false">
    <system.codedom>
      <compilers>
        <compiler language="c#;cs;csharp" extension=".cs" ....
        <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" ....
      </compilers>
    </system.codedom>
</location>

另见https://docs.microsoft.com/en-us/dotnet/api/system.configuration.sectioninformation.inheritinchildapplications


如果这些都不起作用,您应该提供一个 Minimal reproducible example