将路由与网络表单一起使用 - CreateInstanceFromVirtualPath 有时非常慢
我正在我的 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%。
谁能建议为什么会发生这种情况?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您的应用程序正在使用视图的运行时编译。虽然您的业务逻辑、代码隐藏等(基本上是任何 .cs 文件)由 Visual Studio 编译,但您的视图(*.aspx、*.ascx、*.Master)在首次请求给定视图时由 asp.net 运行时编译(即,BuildManager 被要求提供与给定虚拟路径相对应的对象)。这可能需要一些时间,因为视图可能会批量编译(例如,单个文件夹中的所有视图)。
如果您更改视图,它将重新编译。此外,如果应用程序域回收,所有视图编译都将失效(如果您对 web.config、global.asax 等进行更改,则可能会发生这种情况)。
所有这些都是 ASP.NET 中的正常行为。如果您发现这在您的场景中是不可接受的,您可以使用预编译应用程序。这将为您提供应用程序启动性能优势,但代价是能够轻松调整站点的标记,而无需重新编译所有内容。
Your application is using runtime compilation of views. While your business logic, codebehind etc (basically any .cs file) gets compiled by Visual Studio, your views (*.aspx, *.ascx, *.Master) are compiled by the asp.net runtime when a given view is first requested (i.e. the BuildManager is asked for an object that corresponds to a given virtual path). It might take some time because views might be compiled in batches (e.g. all views in a single folder).
A view will be recompiled if you change it. Also all view compilations will be invalidated if the App Domain recycles (which can happen if you make changes to web.config, global.asax, etc).
All this is normal behavior in ASP.NET. If you find that this is unacceptable in your scenarios you can use precompiled applications. This will provide you with app startup perf benefits at the cost of being able to easily tweak the markup of your site withouth having to recompile everything.