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

如何在ASP.NET中动态插入网页(并更新插件)?,asp.net,mef,appdomain,maf,plugin-architecture,Asp.net,Mef,Appdomain,Maf,Plugin Architecture,对于常规程序集,可以使用MEF动态加载程序集。如果这些程序集需要实时更新,建议使用AppDomains托管动态程序集(可能可以使用托管外接程序框架(MAF))。当需要更新时,将停止appdomain,更新程序集并重新加载appdomain ASP.NET加载的程序集中包含代码隐藏类,那么这些程序集又如何呢?如何在不强制重新启动主appdomain的情况下更新它们。是否可以在动态appdomain中托管我的一些页面?你会怎么做?此appdomain能否共享登录令牌和身份验证内容,以便用户不必重新登

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

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


谢谢

MEF不支持AppDomain隔离,所以不幸的是,即使在重新编译期间,以前加载的程序集仍然加载在主web应用程序AppDomain中。在ASP.NET中,您需要解决两件事:

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

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

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

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

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

    对于您的实际问题:

    • 在您的应用程序池有权访问的网站外创建文件夹
    • 把你的新组件放进去
    • 拥有一个任务/线程/Web服务,用于读取文件夹并将程序集加载到当前应用程序域
      • Assembly.LoadFrom(字符串)
      • 创建实例时,程序集的较新版本应优先

    我猜你的问题是说这种方法不起作用?您得到了什么错误…

    简单地说,您的建议是只回收池,然后它将重新加载新程序集?我理解正确吗?一句话,是的。对于您来说,这似乎是一个令人失望的答案,但ASP.NET应用程序的设计就是以这种方式运行的。当您为应用程序规划功能集时,值得考虑您所设计的功能是否适用于最常见的用例。这有意义吗?我的想法是创建一个子web应用程序(嵌套web应用程序),以便可以循环使用子应用程序而不是父应用程序。你觉得怎么样?这可能是一个多一点的工作,但它确实给了我更多的灵活性,不是吗?