Asp.net 在webforms中使用路由-CreateInstanceFromVirtualPath有时非常慢

Asp.net 在webforms中使用路由-CreateInstanceFromVirtualPath有时非常慢,asp.net,asp.net-mvc,performance,routing,csc,Asp.net,Asp.net Mvc,Performance,Routing,Csc,我在ASP.NET WebForms应用程序中使用路由,使用Phil Haack描述的技术: 这在大多数情况下都能很好地工作,但是有时第一次调用System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath需要几十秒才能返回 这种情况发生在以下方法中: public IHttpHandler GetHttpHandler(RequestContext requestContext) { LapTimer lapTi

我在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;
}
与此同时,我注意到(使用任务管理器)一个名为C#编译器的进程占用了我10%-50%的CPU


有人能解释为什么会发生这种情况吗?

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

如果更改视图,将重新编译该视图。此外,如果应用程序域回收(如果您更改web.config、global.asax等),则所有视图编译都将无效


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

即使预编译也会在服务器上留下.aspx存根,以便ASP.NET知道如何处理它们,这将导致运行
aspnet\u compiler.exe
。不过,这不会花那么长时间。你有多少文件,需要多长时间?正如我前面所说的,这是ASP.NET的正常行为,除非它错了。顺便说一句,即使您不使用预编译的站点,
aspnet\u compiler.exe
也会运行,然后是
csc.exe