2011-07-26 6 views
1

質問に文脈を与えるために、私はApplication_BeginRequestで呼び出されたプロファイラを作成しましたが、すべて(つまりjavascript、画像など)をログに記録しています。最後の手段として、プロファイラクライアントにフィルタリングを追加することは可能ですが、要求がルーティングを必要とすると判断できる場合はプロファイラをアクティブ化するだけです。理想的には、それはApplication_BeginRequestにありますが、ルーティングの着信要求の冗長処理なしでは可能ではないと思います...ASP.NET MVC - 静的リソースリクエストを検出できるリクエストサイクルの最も初期のポイントは何ですか?

要するに、要求ライフサイクルの中で最も早い時点要求が静的なリソースのためのものかどうか、そしてそれについてどうやって行くのですか?

System.Web.Routing.RouteTableから派生したり、そこからプロファイラコードを呼び出すことは可能でしょうか?

答えて

1

: -

それとも、単にあなたのために働くRequest.PhysicalPathと希望を確認するために最初のリンクを使用して、現在のメソッドを使用します。基本的には、静的リソース要求を検出することができないときに、静的リソース要求を検出するのはなぜですか? Global.asaxの中:今すぐ

private readonly string[] STATIC_CONTENT_PATHS = new string[] { "css", "js", "img" }; 

public static void RegisterRoutes(RouteCollection routes) 
{  
    foreach (string path in STATIC_CONTENT_PATHS) { routes.IgnoreRoute(path + @"/{*foo}"); } 

    // other MapRoute calls here 
} 

私が何らかの理由で、私はまだ次の操作を行うことができますしたい場合が、私はもはや、静的な要求のためにチェックする必要がありません:

protected void Application_BeginRequest() 
{    
    if (IsStaticRequest()) 
    { 
     // do something here 
    } 
} 

private bool IsStaticRequest() 
{ 
    var result = Request.Url.AbsolutePath.Split('/'); 
    if (result.Length < 2) return false; 
    return STATIC_CONTENT_PATHS.Contains(result[1]); 
} 

私は知っているので、静的なコンテンツを提供する唯一の経路は絶対確実です。これは非常に堅牢なソリューションのようです。私はまだ他のアイデアに触れていますが、これは私のニーズによく合っていると思います。

2

さまざまなオプションがあります。 ファースト - Request.PhysicalPathを使用して静的ファイルを決定する - チェックアウト: Check for a static file during Application_BeginRequest?

1つの選択肢は、ハンドラとしてこれを持っているし、含めるファイルの種類を注意することは、パスを使用することです(* .aspxの)例えばあなたのweb.configで。かなり早い時期にイベントにアクセスすることができます(asp.netパイプラインを参照)

httpmoduleを使用するだけで、すべてをチェックし、あなたが言及したように物理的でないアイテムをプロファイルします。私は別の角度からそれに近づいてみましたし、その結果に非常に幸せだしました)

+0

Request.PhysicalPathアプローチの問題点は、要求がファイル名に直接マップできる場合は要求が静的であると想定し、そうでない場合は静的要求ではないことを前提としています。たとえば、誤った名前のリンクや削除されたイメージファイルへの参照が、ファイルがディスク上に存在しないという理由だけで非静的リンクとして解釈されることは望ましくありません。 – nathanchere

+0

あなたのコードでは、このケースを判別するためにレスポンスコードをチェックすることができます(動的ファイルが見つからない場合でも同じことが言えます)。ファイルタイプの前提条件を設定するか、またはすべてのマッピングに対してiisまたはappsの設定を問い合わせる必要があるかどうかを真に検出するには技術的には、.jsをaspnet_isapiや他のhttphandlerにマッピングするだけで、.jsを動的なファイルにすることができます。どこで線を描きたいのですか? –

2

MVCフィルタは、前処理および後処理の動作を追加することが可能とfilterContextパラメータはあなたに十分な情報を与える必要がありますので、私はむしろ、プロファイリングのためにMVCフィルタを使用します。

例えば、私は

public class ProfilerAttribute : FilterAttribute, IActionFilter, IResultFilter, IExceptionFilter { 
    public void OnActionExecuting(ActionExecutingContext filterContext) { 
     Debug.WriteLine("Before Action is executing"); 
    } 

    public void OnActionExecuted(ActionExecutedContext filterContext) { 
     Debug.WriteLine("After Action is executed"); 
    } 

    public void OnResultExecuted(ResultExecutedContext filterContext) { 
     Debug.WriteLine("After Action Result is executed");    
    } 

    public void OnResultExecuting(ResultExecutingContext filterContext) { 
     Debug.WriteLine("Before Action Result is executing"); 
    } 

    public void OnException(ExceptionContext filterContext) { 
     Debug.WriteLine("oops! exception"); 
    } 
} 

をプロファイリングするためProfilerAttributeを作成しますとGlobal.ascxGlobalFilterとして登録....

public static void RegisterGlobalFilters(GlobalFilterCollection filters) { 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new ProfilerAttribute()); 
} 

は、それが役立つことを願って。ありがとう。

更新:MVCフィルターのみルーティングが一致した後を実行していることに言及し忘れました。したがって、MVCによって既に行われているので、静的リソースを除外する必要はありません。

+0

私はもともとActionExecutingと派生したコントローラクラスのactionExecutedの呼び出しを使用していましたが、Viewレンダリング、ルーティングなど、プロファイルできるようにしたいものが欠けてしまうという問題がありました。 – nathanchere

+1

IResultFilterを実装することで、アクション結果がViewResultの場合、Viewレンダリングのようにプロファイルできます。コントローラの動作が遅いのか、実行結果が遅いのかを知ることができます。ルーティングはAsp.netの一部であるため、パフォーマンスに関してはそれほどのことはできません。 ASP.NETランタイムをプロファイリングする場合は、ASP.NET用のパフォーマンスカウンタを使用できます。 http://goo.gl/uRB8f :) –

+0

このMSDN Magazineの記事も役に立つかもしれません.. http://msdn.microsoft.com/en-us/magazine/hh288078.aspx –

関連する問題