asp.net - 如何在 ASP .NET 中动态插入网页(并更新插件)?

标签 asp.net mef appdomain maf plugin-architecture

对于常规程序集,可以使用 MEF 动态加载程序集。如果需要对这些程序集进行实时更新,建议使用 AppDomains 来托管动态程序集(可能可以使用托管加载项框架 (MAF))。当需要更新时,应用程序域将停止,程序集将被更新并重新加载应用程序域。

由 ASP .NET 加载且包含类背后代码的程序集又如何呢?如何在不强制重新启动主应用程序域的情况下更新它们。是否可以在动态应用程序域中托管我的一些页面?你会怎么做?此应用程序域是否可以共享登录 token 和身份验证内容,以便用户不必重新登录?

谢谢

最佳答案

MEF 不支持 AppDomain 隔离,因此不幸的是,即使在重组期间,那些先前加载的程序集仍会加载到主 Web 应用程序 AppDomain 中。在 ASP.NET 中您需要应对两件事:

  1. 对物理文件(例如 .aspx、.cshtml 等)的任何更改,或对配置文件 (.config) 的任何更改,或对\bin 目录的任何更改都将导致应用程序被回收。这是由于两件事造成的,页面/配置的文件监视和\bin 目录的文件监视(这是因为默认情况下 ASP.NET 使用文件的卷影复制 - 建议这样做)。

  2. 要在另一个 AppDomain 中使用 MEF 需要大量的跨域通信,无论是通过序列化还是 MarshalByRef,我认为这永远不会是一个干净的实现。也不知道如何触发用于在另一个 AppDomain 中动态编译页面的 BuildProvider 实例。

我想知道你是不是想太多了。从 IIS6 开始,HTTP.SYS 已管理将传入请求路由到适当的网站,这是在内核级别处理的。即使主应用程序确实重新启动(有多种原因可以重新启动),也不会删除任何请求,它只会在传递请求之前排队等待新的工作进程。当然,从用户的角度来看,他们可能会注意到等待新应用程序重新启动的一些空闲时间,但实际上,您将多久进行一次这些更改?

许多应用程序设计都受到过度设计的困扰。您可能想要针对每个场景进行设计,但实际上维护一个简单但可扩展的系统会更容易。在我看来,想要做你指定的事情将被归类为过度设计。保持简单。

关于asp.net - 如何在 ASP .NET 中动态插入网页(并更新插件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7560058/

相关文章:

c# - 一个进程中加载​​的最大应用域数

c# - 从移动设备查看的 asp.net 页面上的回发问题

asp.net - 存储电话号码

wpf - 在没有参数化构造函数的情况下如何加载 PRISM V4 View ?

c# - 如何从 MEF 导入创建新对象

c# - 由于程序集名称而导致 MEF 组合错误?

c# - 在应用程序域之间来回传递集合对象

c# - 如何处理从另一个 AppDomain 抛出的异常?

c# - ASP.NET Identity 在每次请求时重新生成 Identity

asp.net - 如何使用 Ninject 注入(inject)一个 asp.net (mvc2) 自定义成员提供程序?