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

时间:2011-09-26 19:12:45

标签: asp.net mef appdomain maf plugin-architecture

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

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

由于

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:0)

使用会话“StateServer”将保留应用程序池回收之间的身份验证(由文件更新引起)。

对于您的实际问题:

  • 在您的网站之外创建一个您的应用程序池可以访问的文件夹。
  • 将新装配体放在那里
  • 拥有一个读取文件夹并将程序集加载到当前App Domain
  • 的任务/线程/ Web服务
    • 在创建实例时,应该优先使用较新版本的程序集

我想你的问题是说这种方法不起作用?你得到什么错误......