问题描述
根据 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>
如果这些都不起作用,您应该提供一个 Minimal reproducible example。