asp.net - 浏览 MVC3 DLL 为 'forgotten' 作为应用程序池回收的一部分

标签 asp.net asp.net-mvc assemblies application-pool glimpse

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

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

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

  1. 修改 web.config 以包含 Glimpse 配置
  2. 将显示所有选项卡,包括“执行”、“元数据”和“模型绑定(bind)”
  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
    • session - 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
    • 模型绑定(bind) - Glimpse.Mvc.Tab.ModelBinding
    • View - 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
    • session - Glimpse.AspNet.Tab.Session
  • Glimpse (1.5.0)
    • 时间线 - Glimpse.Core.Tab.Timeline
    • 跟踪 - Glimpse.Core.Tab.Trace

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

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

最佳答案

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

您可以通过将以下行添加到 Global.asax 中的 Application_Start 方法来亲自查看这一点

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 个程序集,Glimpse.Mvc3 就是其中之一

回收后

已加载 30 个程序集,但 Glimpse.Mvc3 不是其中之一

已加载 30 个程序集,但 Glimpse.Mvc3 不是其中之一

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

已加载 70 个程序集,Glimpse.Mvc3 就是其中之一

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

这能解决您的问题吗?恐怕不是,但我认为最好在 glimpse issue tracker 上继续讨论。 ,事实上我已经找到了 similar issue在那儿,但我不确定它是不是你的。

更新 即将发布的 Glimpse 版本中将会有一个修复程序,但同时也有一个解决方案/解决方法,如 one of the comments 中所述。关于 Glimpse 问题。

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

BuildManager.GetReferencedAssemblies()

you're good to go

关于asp.net - 浏览 MVC3 DLL 为 'forgotten' 作为应用程序池回收的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17706748/

相关文章:

asp.net - 从 telerik 控件中删除默认内联样式

asp.net - mysql asp.net c# unicode

.net - ASP.net MVC 中的 session 结束

asp.net-mvc - 从 Flash 向 Asp.Net MVC 应用程序执行 http Post 的正确方法是什么?

c# - assembly.GetTypes() 不返回所有类型

c# - 如何从 C# 中的 DLL 获取类型列表?

c# - 如何制作一个公共(public)子类来删除重复代码

asp.net - 在 ASP.NET 中哪里注册 RegisterClientScriptBlock?

asp.net - 登录 ASP.net MVC 的最佳实践?

web-services - 安装 WIF 运行时以在 Windows Azure 中托管 .NET 应用程序