作为应用程序池回收的一部分,MVC3 DLL 被“遗忘”

2024-03-20

我们正在努力获得Glimpse http://getglimpse.com/在我们的环境中启动并运行,但遇到一个奇怪的问题。

我们已经安装了 Glimpse.Core、Glimpse.AspNet 和 Glimpse.Mvc3.dll,当我们配置 web.config 来启用 Glimpse 时,一切正常直到应用程序池回收。一旦 AppPool 回收,站点就好像“忘记”了 Glimpse.Mvc3.dll,并且 Mvc3 选项卡(执行、模型、元数据)消失了。

以下是(我们)重现的步骤:

  1. 修改 web.config 以包含 Glimpse 配置
  2. 将显示所有选项卡,包括执行、元数据和模型绑定
  3. 执行应用程序池回收
  4. MVC3 Glimpse 选项卡将不再显示(但其他选项卡会显示)

在 AppPool 回收之前,Glimpse.axd 显示以下已注册选项卡:

  • Glimpse.AspNet (1.3.1)
    • 配置 - Glimpse.AspNet.Tab.Configuration
    • 环境 - Glimpse.AspNet.Tab.Environment
    • 请求-Glimpse.AspNet.Tab.Request
    • 路由 - Glimpse.AspNet.Tab.Routes
    • 服务器 - Glimpse.AspNet.Tab.Server
    • 会话 - Glimpse.AspNet.Tab.Session
  • Glimpse (1.5.0)
    • 时间轴 - Glimpse.Core.Tab.Timeline
    • 跟踪 - Glimpse.Core.Tab.Trace
  • Glimpse.Mvc3 (1.3.2)
    • 执行 - Glimpse.Mvc.Tab.Execution
    • 元数据 - Glimpse.Mvc.Tab.Metadata
    • 模型绑定 - Glimpse.Mvc.Tab.ModelBinding
    • 视图 - Glimpse.Mvc.Tab.Views

AppPool 回收后,Glimpse.axd 显示以下已注册选项卡:

  • Glimpse.AspNet (1.3.1)
    • 配置 - Glimpse.AspNet.Tab.Configuration
    • 环境 - Glimpse.AspNet.Tab.Environment
    • 请求-Glimpse.AspNet.Tab.Request
    • 路由 - Glimpse.AspNet.Tab.Routes
    • 服务器 - Glimpse.AspNet.Tab.Server
    • 会话 - Glimpse.AspNet.Tab.Session
  • Glimpse (1.5.0)
    • 时间轴 - Glimpse.Core.Tab.Timeline
    • 跟踪 - Glimpse.Core.Tab.Trace

就好像该网站“忘记”了 Glimpse.Mvc3.dll 作为 AppPool 回收的一部分。

任何想法/建议都非常感激。


原因似乎是 ASP.Net 及其首次和回收后从应用程序目录加载程序集的方式。首次启动时,程序集从应用程序的 bin 目录加载,在回收(甚至 IIS 重新启动)后,它从应用程序的 bin 目录加载程序集。临时 ASP.NET 文件目录。并根据情况加载或多或少的程序集。

您可以通过将以下行添加到您的Application_Start方法在你的Global.asax

protected void Application_Start()
{
    Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
    bool glimpseMvc3AssemblyLoaded = loadedAssemblies.Any(a => a.FullName.Contains("Glimpse.Mvc3"));
    File.AppendAllText(
        "C:\\temp\\output.txt",
        string.Format(
            "{0}{1} assemblies loaded and Glimpse.Mvc3 is{2} one of them",
            Environment.NewLine,
            loadedAssemblies.Length,
            glimpseMvc3AssemblyLoaded ? string.Empty : " not"));
}

如果运行该命令,您将在 output.txt 文件中看到以下条目(尽管数字可能不同)

第一次初始启动时:

60 assemblies loaded and Glimpse.Mvc3 is one of them

回收后

30 assemblies loaded and Glimpse.Mvc3 is not one of them

30 assemblies loaded and Glimpse.Mvc3 is not one of them

删除里面对应的目录后临时 ASP.NET 文件目录

70 assemblies loaded and Glimpse.Mvc3 is one of them

这与一瞥有何关联。 Well Glimpse 拨打电话AppDomain.Current.GetAssemblies()之后它将寻找实现的类型ITab,但如果Glimpse.Mvc3未返回程序集,则不会发现其中定义的选项卡,因此不会显示。

这能解决您的问题吗?恐怕不是,但我认为最好继续讨论一瞥问题跟踪器 https://github.com/glimpse/glimpse/issues,事实上我已经找到了类似问题 https://github.com/Glimpse/Glimpse/issues/462在那儿,但我不确定它是不是你的。

Update即将发布的 Glimpse 版本中将会有一个修复程序,但同时有一个解决方案/解决方法,如中所述评论之一 https://github.com/Glimpse/Glimpse/issues/462#issuecomment-21168158关于一瞥问题。

只需将以下语句添加到全局.asax Application_Start method

BuildManager.GetReferencedAssemblies()

and 你可以走了 https://github.com/Glimpse/Glimpse/issues/462#issuecomment-21170223

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

作为应用程序池回收的一部分,MVC3 DLL 被“遗忘” 的相关文章

随机推荐