System.Addin-创建安全的ASP.NET MVC插件
最近我的重点是创建一个ASP.NET MVC应用程序,它可以承载第三方MVC插件。理想情况下,这些插件的开发将遵循以下规则:System.Addin-创建安全的ASP.NET MVC插件,asp.net,asp.net-mvc,plugins,appdomain,Asp.net,Asp.net Mvc,Plugins,Appdomain,最近我的重点是创建一个ASP.NET MVC应用程序,它可以承载第三方MVC插件。理想情况下,这些插件的开发将遵循以下规则: 插件可以在标准MVC项目中开发,并且能够使用ASP.NET MVC框架的所有现有基础设施 编译插件MVC项目并将其包含到宿主MVC应用程序中的复杂性应该不会很高 对MVC应用程序的正常开发流程的任何更改都是最低限度的 经过一些研究,我提出了以下方法来实现这一点,每种方法都有各自的优点和缺点 方法1-MVC插件程序集加载到主MVC AppDomain 工作流程 在单独的M
- 在单独的MVC项目中开发插件
- 编译程序集并通过主项目中的
、MEF或基本程序集引用(如果可能)将其和任何依赖项加载到主应用程序中PreApplicationStartMethodAttribute
- 将路径映射到插件控制器,以便插件被视为主机内的
区域
- 将插件视图放入正确的区域文件夹中。布局文件需要更改,以便布局路径指向基于区域的位置,而不是应用程序的根(在开发MVC项目中就是这种情况)
- 当插件请求进来时,ASP.NET将使用现有区域功能将请求路由到正确的控制器,并在正确的位置查找视图文件
PreApplicationStartMethodAttribute
,项目参考)和应用程序启动之后(MEF),将程序集包含到宿主应用程序域中非常简单System.IO.File.Delete
,那么插件也可以)
方法2-通过MAF在自己的AppDomain中运行MVC插件程序集
此方法旨在允许创建MVC插件,这些插件可以被沙盒放入它们自己的AppDomains
,并由主机通过系统使用。Addin
库
结构
example.com/p/{plugin}/{controller}/{action}/{id}
{plugin}
段确定处理请求的适当插件RequestContext
,并返回ActionResult
RequestContext
和ActionResult
的适配器,以便跨管道的隔离边界进行传输AppDomain
中,并通过RequestContext
(通过管道序列化)调用AcceptRequestActionResult
,然后接收方对象将该ActionResult
(也通过管道序列化)传递回主机AppDomain
ActionResult
返回到主机MVC执行管道,就好像它自己处理了请求一样。如果愿意,可以卸载插件AppDomainAppDomain
中,因此可以使用适合主机的任何权限集
缺点
- 必须能够序列化
和RequestContext
ActionResult
- 可能会破坏隔离的
中的其他ASP.NET MVC功能AppDomain
RequestContext
和ActionResult
对象,以及单独运行MVC控制器
问题
如果代码是由受信任的开发人员创建的,那么第一种方法就可以了。我知道我不会删除所有的主机视图文件或它的web.config文件。但最终,如果你想让第三方开发者为你的MVC应用程序创建插件,你需要能够对他们的代码进行沙箱处理
根据我所有的研究,当您使用简单的基于API的CLA时,System.Addin
库可以轻松实现主机/插件环境