2

Phil Haack によって説明されている手法を使用して、ASP.NET WebForms アプリケーションでルーティングを使用しています。

これはほとんどの場合うまく機能しますが、場合によっては、最初の呼び出しが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# コンパイラであるcsc.exeというプロセスが CPU の 10% ~ 50% を占有していることに気付きました。

なぜこれが起こるのか誰にも示唆できますか?

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 に答える