我们在MVC3项目中使用Unity作为我们的IoC容器。 我们刚刚安装了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 事件日志中。
您的跟踪指向 XmlConfigurator
,即 log4net。 log4net 将其配置存储在与 web.config 不同的文件中,因此它会启动文件系统观察器来检查文件是否已更改为重新配置自身。
看起来性能问题的罪魁祸首是log4net,而不是Unity。
Unity 本身就没有这样的事情。事实上,堆栈跟踪根本不在 Unity 代码中,而是在控制器工厂内。
谁写了添加文件系统观察程序。这很愚蠢,因为ASP. NET已经监视web.config,并在应用程序域发生变化时重新启动它。