我使用我的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%。
有谁能说明为什么会发生这种情况?
答案 0 :(得分:2)
您的应用程序正在使用运行时编译视图。当您的业务逻辑,代码隐藏等(基本上任何.cs文件)由Visual Studio编译时,您的视图(* .aspx,* .ascx,* .Master)在首次请求给定视图时由asp.net运行时编译(即,要求BuildManager提供与给定虚拟路径对应的对象)。可能需要一些时间,因为视图可能是批量编译的(例如,单个文件夹中的所有视图)。
如果您更改了视图,则会重新编译该视图。如果App Domain回收,那么所有视图编辑都将失效(如果您对web.config,global.asax等进行更改,则可能会发生这种情况。)
所有这些都是ASP.NET中的正常行为。如果您发现在您的方案中这是不可接受的,您可以使用precompiled applications。这将为您提供应用程序启动性能优势,但代价是能够轻松调整站点的标记,而无需重新编译所有内容。