CKFinder Zip安装CodeDom Provider Type异常

CKFinder Zip installation CodeDom Provider Type exception

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

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

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

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, 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.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, BuildProviderAppliesTo neededFor, 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, CodeDirectoryType dirType, String assemblyName, StringSet excludedSubdirectories)
   at System.Web.Compilation.BuildManager.CompileCodeDirectories()
   at System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()

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

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

** 更新 **

我从父应用程序(ASP.NET 4.6.2,MVC 中的一个单独的独立解决方案)中删除了 roslyn,现在 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工程执行的时候,查找compiler provider assembly,找不到。我看到四种不同的方法:

1合并为一个项目

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

2 宿主为兄弟姐妹

将它们作为兄弟姐妹托管在服务器上,而不是彼此托管(即 http:///localhost/MainApp/ 的主应用程序和 http:///localhost/ckfinder/ 的 CKFinder 项目)或使用不同的子域.

3 将编译器添加到 CKFinder 应用

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

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

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

<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


如果 none 这个作品你应该提供一个 Minimal reproducible example.