代码之家  ›  专栏  ›  技术社区  ›  Buu

如何将新版本的ASPX文件编译并加载到应用程序中?

  •  1
  • Buu  · 技术社区  · 15 年前

    在为ASPX页提供请求时,如果ASP.NET注意到该页有任何更改,它将自动将该页重新编译为程序集,并使用该新页定义来处理该请求。

    据我所知,.NET不允许我们从应用程序域卸载程序集。但是,它允许我们卸载整个应用程序域(及其程序集)。因此,在我看来,ASP.NET用新程序集(更新后的ASPX文件)替换旧程序集的唯一方法是卸载整个应用程序域并创建一个新程序集来承载Web应用程序(这实际上是应用程序重新启动,当web.config更改、程序集bin文件夹更新等时会发生这种情况)但是,我注意到情况似乎并非如此,因为在修改aspx文件之后,应用程序的响应比修改web.config文件时快得多。

    因此,我的问题是:ASP.NET是否可以在不卸载整个应用程序并创建新的应用程序的情况下加载新版本的ASPX页程序集?

    3 回复  |  直到 15 年前
        1
  •  1
  •   stevemegson    15 年前

    ASP.NET无法在不重新启动应用程序的情况下卸载旧程序集,但它可以忽略旧程序集并开始使用页面的新编译版本。编译并加载新程序集(实际上包含整个文件夹,而不仅仅是一个已更改的页面),随后的请求使用该新程序集。

    通过在页面中写出程序集名称,可以看到程序集的更改:

    <%= System.Reflection.Assembly.GetExecutingAssembly().FullName %>
    

    在不同文件夹中有两个页面时,您将看到更改的页面移动到新程序集,而另一个页面不受影响。

    为了避免用旧程序集逐渐填满内存,应用程序将偶尔重新启动以响应更改。默认情况下,这是每15次更改一次,不过您可以在web.config中使用

    <compilation debug="false" numRecompilesBeforeAppRestart="50" ...
    
        2
  •  1
  •   Nariman    15 年前

    Steve的答案在很大程度上是准确的,尽管所描述的行为(文件更改时的程序集生成)是以默认值为基础的 compilationMode=始终 ;您可以避免与 编译模式=从不 . 作为旁白,请注意还有一个 new attribute available in 3.5 尽管它与以前重新启动应用程序(如web.config)的顶级更改特别相关:

    默认情况下,当对 网站中的顶级文件, 重新编译整个站点。顶层 文件包括global.asax文件和 垃圾箱中的所有文件和应用程序代码 文件夹。重新编译是最安全的 当其中一个文件 更改,因为中的其他文件 站点,如.aspx和.ascx文件, 可以引用由创建的对象 顶级文件中的代码。

    当重新编译所有内容时 对大多数应用来说都可以 使一个非常大的应用程序 长期不可用 即使做了微小的改变 对它。如果应用程序很大 足够了,它可能无法用于 A后5到10分钟或更长时间 改变了。

    如果你想改变 顶级文件而不会导致 要重新编译整个站点,可以 设置 优化编译 属性 中的编译元素 web.config文件为true。

        3
  •  0
  •   Ilya Khaprov    15 年前

    ASP.NET计算文件的哈希值,并在文件更改时重新编译它们

    由于.NET无法卸载程序集而不卸载整个AppDomain,因此ASP.NET也不能这样做。