Unity IoC在ReadDirectoryChangesW中花费了大量时间

时间:2012-12-11 00:51:15

标签: asp.net-mvc-3 unity-container ioc-container

我们在MVC3项目中使用Unity作为我们的Io​​C容器。我们刚刚安装了dynatrace,它显示了在FileSystemWatcher.StartRaisingEvents方法中花费了大量时间,特别是在ReadDirectoryChangesW中。这似乎导致了糟糕的表现。

为什么Unity会监控文件系统?

Here's the call stack:

ChildActionExtensions.RenderAction
  HttpServerUtility.Execute
    HttpHandlerUtil+ServerExecuteHttpHandler.Wrap
      UnityControllerFactory.CreateController
        XmlConfigurator.ConfigureAndWatch
          FileSystemWatcher.StartRaisingEvents
            UnsafeNativeMethods.ReadDirectoryChangesW

这是UnityControllerFactoryCode

        try
        {
            if (requestContext.RouteData.DataTokens.ContainsKey("area") && !string.IsNullOrWhiteSpace(requestContext.RouteData.DataTokens["area"].ToString()))
            {
                controllerName = string.Format("{0}/{1}", requestContext.RouteData.DataTokens["area"], controllerName);
            }

            controllerName = controllerName.ToLower();

            return _container.Resolve<IController>(controllerName);
        }
        catch (Exception ex)
        {
            if (ex is ResolutionFailedException)
            {
                IMyLogger logger = _container.Resolve<IMyLogger>();
                logger.Error(LogEventIdType.General, ex, "Is the '{0}' controller defined in the Unity Container via RegisterType (in lowercase) in UnityIocBootstrapConfigure?", new object[] {controllerName});
                throw;
            }             
        }

记录器记录到Windows事件日志。

2 个答案:

答案 0 :(得分:1)

Unity本身没有这样的事情。实际上,堆栈跟踪根本不在Unity代码中,它位于控制器工厂内部。

无论谁编写,都添加了文件系统观察程序。从ASP开始,这非常愚蠢。 NET已经监视web.config并重新启动appdomain,如果它发生了变化。

答案 1 :(得分:1)

您的跟踪指向XmlConfigurator,即log4net。 log4net将其配置存储在与web.config不同的文件中,因此它启动文件系统观察程序以检查文件是否已更改为重新配置。

似乎你的性能问题的罪魁祸首是log4net,而不是Unity。