标题:从零开始实现ASP.NET Core MVC的插件式开发(七) - 问题汇总及部分解决方案
作者:Lamond Lu
地址:https://www.cnblogs.com/lwqlun/p/12930713.html
源代码:https://github.com/lamondlu/Mystique
从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用Application Part动态加载控制器和视图
从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板
从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件
从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装
从零开始实现ASP.NET Core MVC的插件式开发(五) - 使用AssemblyLoadContext实现插件的升级和删除
从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用
简介在上一篇中,我给大家讲解插件引用程序集的加载问题,在加载插件的时候,我们不仅需要加载插件的程序集,还需要加载插件引用的程序集。在上一篇写完之后,有许多小伙伴联系到我,提出了各种各样的问题,在这里谢谢大家的支持,你们就是我前进的动力。本篇呢,我就对这其中的一些主要问题进行一下汇总和解答。
如何在Visual Studio中以调试模式启动项目?在所有的问题中,提到最多的问题就是如何在Visual Studio中使用调试模式启动项目的问题。当前项目在默认情况下,可以在Visual Studio中启动调试模式,但是当你尝试访问已安装插件路由时,所有的插件视图都打不开。
这里之前给出临时的解决方案是在bin\Debug\netcoreapp3.1目录中使用命令行dotnet Mystique.dll的方式启动项目。
视图找不到的原因及解决方案这个问题的主要原因就是主站点在Visual Studio中以调试模式启动的时候,默认的Working directory是当前项目的根目录,而非bin\Debug\netcoreapp3.1目录,所以当主程序查找插件视图的时候,按照所有的内置规则,都找不到指定的视图文件, 所以就给出了The view 'xx' was not found的错误信息。
因此,这里我们要做的就是修改一下当前主站点的Working directory即可,这里我们需要将Working directory设置为当前主站点下的bin\Debug\netcoreapp3.1目录。
PS: 我在开发过程中,将.NET Core升级到了3.1版本,如果你还在使用.NET Core 2.2或者.NET Core 3.0,请将Working directory配置为相应目录
这样当你在Visual Studio中再次以调试模式启动项目之后,就能访问到插件视图了。
随之而来的样式丢失问题看完前面的解决方案之后,你不是已经跃跃欲试了?
但是当你启动项目之后,会心凉半截,你会发现整站的样式和Javascript脚本文件引用都丢失了。
这里的原因是主站点的默认静态资源文件都放置在项目根目录的wwwroot子目录中,但是现在我们将Working directory改为了bin\Debug\netcoreapp3.1了,在bin\Debug\netcoreapp3.1中并没有wwwroot子目录,所以在修改Working directory后,就不能正常加载静态资源文件了。
这里为了修复这个问题,我们需要对代码做两处修改。
首先呢,我们需要知道当我们使用app.UseStaticFiles()添加静态资源文件目录,并以在Visual Studio中以调试模式启动项目的时候,项目查找的默认目录是当前项目根目录中的wwwroot目录,所以这里我们需要将这个地方改为PhysicalFileProvider的实现方式,并指定当前静态资源文件所在目录是项目目录下的wwwroot目录。
其次,因为当前配置只是针对Visual Studio调试的,所以我们需要使用预编译指令#if DEBUG和`#if !DEBUG针对不同的场景进行不同的静态资源文件目录配置。
所以Configure()方法最终的修改结果如下:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } #if DEBUG app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider(@"G:\D1\Mystique\Mystique\wwwroot") }); #endif #if !DEBUG app.UseStaticFiles(); #endif app.MystiqueRoute(); }在完成修改之后,重新编译项目,并以调试模式启动项目后,你就会发现,我们熟悉的界面又回来了。