ASP.net MVC:为什么AreaRegistration.RegisterAllAreas()这么慢?

时间:2012-01-05 13:00:00

标签: c# asp.net-mvc performance

我有一个小型ASP.net MVC应用程序,包含大约10个视图和2个控制器,这需要永远(不是永远但在30-50秒之间)加载站点。

我做了一些分析,发现超过50%的时间是花在我的Global.asax.cs文件中的以下行:

AreaRegistration.RegisterAllAreas();

可能是什么原因以及如何改善表现?

2 个答案:

答案 0 :(得分:9)

您使用的是MVC区域吗?如果没有,只需删除或注释该行。我以前注意到了这一点,但没有真正的解释。

答案 1 :(得分:0)

这很慢,因为它将反映所有正在寻找区域注册的程序集并构建缓存文件。另请参见Inside Areas Registration

如果您正在使用区域,我已经写了一个小的扩展名来注册特定区域,因此您不必担心需要扫描所有程序集:

public static class AreaRegistrationExtensions
{
    /// <summary>
    /// Register specific Area.
    ///
    /// This circumvents the slow RegisterAllAreas that will perform assembly scanning.
    /// Implementation based on MVC source code.
    /// </summary>
    /// <typeparam name="TArea"></typeparam>
    /// <param name="application"></param>
    public static void RegisterArea<TArea>(this HttpApplication application) where TArea : AreaRegistration
    {
        var registration = (AreaRegistration)Activator.CreateInstance(typeof(TArea));
        var context = new AreaRegistrationContext(registration.AreaName, RouteTable.Routes);
        string str = typeof(TArea).Namespace;
        if (str != null)
            context.Namespaces.Add(str + ".*");
        registration.RegisterArea(context);
    }
}

Application_Start中的用法:

this.RegisterArea<MyArea>();