2

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

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

这发生在以下方法中:

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# 编译器进程占用了我 10%-50% 的 CPU。

谁能建议为什么会发生这种情况?

4

1 回答 1

2

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

如果您更改视图,将重新编译它。此外,如果应用程序域回收(如果您对 web.config、global.asax 等进行更改可能会发生这种情况),所有视图编译都将失效。

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

于 2010-09-10T17:10:24.563 回答