使用webforms进行路由 - CreateInstanceFromVirtualPath有时非常慢

时间:2010-09-10 14:47:08

标签: asp.net asp.net-mvc performance routing csc

我使用我的ASP.NET WebForms应用程序使用路由,使用Phil Haack描述的技术:

这在大多数情况下运作良好,但有时第一次调用System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath需要几十秒才能返回。

这种情况发生在以下方法中:

public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
    LapTimer lapTimer = new LapTimer();

    string virtualPath = this.GetSubstitutedVirtualPath(requestContext, lapTimer);
    if (this.CheckPhysicalUrlAccess && !UrlAuthorizationModule.CheckUrlAccessForPrincipal(virtualPath, requestContext.HttpContext.User, requestContext.HttpContext.Request.HttpMethod))
        throw new SecurityException();

    IHttpHandler page = BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(Page)) as IHttpHandler;
    if (page != null)
    {
        //Pages that don't implement IRoutablePage won't have the RequestContext
        //available to them. Can't generate outgoing routing URLs without that context.
        var routablePage = page as IRoutablePage;
        if (routablePage != null)
            routablePage.RequestContext = requestContext;
    }

    return page;
}

与此同时,我注意到(使用任务管理器)一个名为csc.exe的进程(C#编译器)占用了我CPU的10%-50%。

有谁能说明为什么会发生这种情况?

1 个答案:

答案 0 :(得分:2)

您的应用程序正在使用运行时编译视图。当您的业务逻辑,代码隐藏等(基本上任何.cs文件)由Visual Studio编译时,您的视图(* .aspx,* .ascx,* .Master)在首次请求给定视图时由asp.net运行时编译(即,要求BuildManager提供与给定虚拟路径对应的对象)。可能需要一些时间,因为视图可能是批量编译的(例如,单个文件夹中的所有视图)。

如果您更改了视图,则会重新编译该视图。如果App Domain回收,那么所有视图编辑都将失效(如果您对web.config,global.asax等进行更改,则可能会发生这种情况。)

所有这些都是ASP.NET中的正常行为。如果您发现在您的方案中这是不可接受的,您可以使用precompiled applications。这将为您提供应用程序启动性能优势,但代价是能够轻松调整站点的标记,而无需重新编译所有内容。