ASP.NET MVC-静的リソース要求を検出できるリクエストサイクルの最も早いポイントは何ですか?
-
26-10-2019 - |
質問
質問をいくつかコンテキストにするために、Application_BeginRequestで呼び出されるプロファイラーを書きましたが、すべてを記録しています(つまり、JavaScripts、画像など)。プロファイラークライアントにフィルタリングを追加することは最後の手段として可能ですが、リクエストにルーティングが必要であると判断できる場合にのみ、プロファイラーをアクティブにすることができます。理想的には、Application_beginRequestにありますが、ルーティングの受信リクエストの冗長処理がなければそれは不可能だと思います...
要するに、リクエストライフサイクルの最も早いポイントは、リクエストが静的リソースのかどうかを判断できるのはいつですか?
System.web.routing.routetableから派生またはフックに導き出して、そこからプロファイラーコードを呼び出すことはおそらく可能ですか?
解決 3
私は別の角度からそれをアプローチしようとしました、そして、結果にはるかに幸せです。基本的に - 静的リソース要求を「ルーティング」しないだけで、なぜ静的リソース要求を検出するのですか? 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]);
}
私は確かに、私が静的コンテンツを提供する唯一のパスが何であるかを確かに知っているので、これはかなり堅牢な解決策のように思えます。私はまだ他のアイデアを受け入れていますが、これは私のニーズに合っていると思います。
他のヒント
さまざまなオプションがあります。まず - request.physicalpathを使用して静的ファイルを決定するには - チェックアウト:application_beginrequest中に静的ファイルを確認しますか?
1つの選択肢は、これをハンドラーとして使用し、パスを使用してファイルの種類を記録して(*.aspx)web.configを含めることです。その後、かなり早い段階でイベントにアクセスできます(ASP.NETパイプラインを参照)
または、httpmoduleを使用するだけです - すべてを確認し、言及したように非物理的なアイテムのみをプロファイルします。
または - 最初のリンクを使用して現在の方法を使用して、request.physicalpathを確認し、それがあなたのために機能することを願っています:)
使いたいです MVCフィルター MVCフィルターを使用するプロファイリングでは、前処理および後処理行動を追加できます。 FilterContext パラメーターは十分な情報を提供する必要があります。
たとえば、プロファイリング用のProfilerAttributeを作成します
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");
}
}
登録します GlobalFilter の Global.Ascx....
public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
filters.Add(new HandleErrorAttribute());
filters.Add(new ProfilerAttribute());
}
それが役立つことを願っています。ありがとう。
アップデート: :MVCフィルターは実行されたことのみを忘れました 後 ルーティングは一致します。そのため、MVCによって既に行われているため、静的リソースをフィルターアウトする必要はありません。