【问题标题】:How is new version of an ASPX file compiled and loaded into the application?新版本的 ASPX 文件如何编译并加载到应用程序中?
【发布时间】:2010-12-09 17:59:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    Steve 的回答在很大程度上是准确的,尽管所描述的行为(文件更改时生成程序集)是基于默认的 CompilationMode=Always;您可以使用 CompilationMode=Never 避免程序集生成。顺便说一句,请注意还有一个 new attribute available in 3.5,尽管它专门与之前重新启动应用程序的顶级更改相关(如 web.config):

    默认情况下,当对 网站中的顶级文件, 整个网站被重新编译。顶层 文件包括 global.asax 文件和 bin 和 App_Code 中的所有文件 文件夹。重新编译最安全 当这些文件之一 更改,因为其他文件在 网站,例如 .aspx 和 .ascx 文件, 可以引用由创建的对象 顶级文件中的代码。

    虽然重新编译一切正常 对于大多数应用程序来说都很好,它可以 导致一个非常大的应用程序 长时间不可用 即使进行了细微的更改 给它。如果应用程序很大 够了,它可能无法用于 五到十分钟或更长时间后 进行了更改。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      为避免旧程序集逐渐填满内存,应用程序有时会重新启动以响应更改。默认情况下,这是每 15 次更改,但您可以在 web.config 中使用

      进行调整
      <compilation debug="false" numRecompilesBeforeAppRestart="50" ...
      

      【讨论】:

        【解决方案3】:

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

        而且由于 .net 不能卸载程序集而不卸载整个 appdomain asp.net 也不能​​这样做

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多