2

我们试图让Glimpse在我们的环境中启动并运行,但遇到了一个奇怪的问题。

我们已经安装了 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
  • 一瞥 (1.5.0)
    • 时间线 - Glimpse.Core.Tab.Timeline
    • 跟踪 - Glimpse.Core.Tab.Trace
  • 一瞥.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
  • 一瞥 (1.5.0)
    • 时间线 - Glimpse.Core.Tab.Timeline
    • 跟踪 - Glimpse.Core.Tab.Trace

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

非常感谢任何想法/建议。

4

1 回答 1

4

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

您可以通过在您的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

删除Temporary ASP.NET Files目录中的相应目录后

70 assemblies loaded and Glimpse.Mvc3 is one of them

这与 Glimpse 有什么关系。好吧,Glimpse 进行调用,AppDomain.Current.GetAssemblies()之后它将查找实现的类型ITab,但如果Glimpse.Mvc3未返回程序集,则不会发现其中定义的选项卡,因此不会显示。

这能解决您的问题吗?恐怕不会,但我认为最好继续在glimpse issue tracker上进行讨论,事实上我已经在那里发现了一个类似的问题,但我不确定它是否是你的。

更新 将在即将发布的 Glimpse 版本之一中进行修复,但同时存在解决方案/解决方法,如对 Glimpse 问题的评论之一所述。

只需将以下语句添加到Global.asax Application_Start方法中

BuildManager.GetReferencedAssemblies()

你可以走

于 2013-07-17T20:58:30.407 回答