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

Mar*_*ark 6 asp.net mef appdomain plugin-architecture maf

对于常规组件,可以使用MEF动态加载组件.如果这些程序集需要实时更新,建议使用AppDomain来托管动态程序集(可能可以使用托管外接程序框架(MAF)).需要更新时,将停止appdomain,更新程序集并重新加载appdomain.

那些由ASP .NET加载的包含类后面代码的程序集呢?如何在不强制重新启动主应用程序域的情况下更新它们.是否可以在动态应用程序域中托管我的一些页面?你会怎么做?这个appdomain可以共享登录令牌和身份验证的东西,这样用户就不必重新登录了吗?

谢谢

Mat*_*ott 2

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

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

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

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

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