ASP.NET MVC - qual è il primo punto del ciclo di richiesta in cui è possibile rilevare una richiesta di risorse statica?

StackOverflow https://stackoverflow.com/questions/6823902

Domanda

Per dare alla domanda un po 'di contesto, ho scritto un profiler che si chiama l'Application_BeginRequest ma è la registrazione tutto (cioè javascript, immagini, ecc). Mentre sarebbe possibile come ultima risorsa per aggiungere il filtraggio al cliente profiler, mi piacerebbe molto, piuttosto solo attivare il profiler quando può essere stabilito che la richiesta richiede di routing. L'ideale sarebbe nel Application_BeginRequest, ma non credo che sarebbe stato possibile senza l'elaborazione ridondante della richiesta in ingresso per il routing ...

Quindi, in breve, quando è il primo punto del ciclo di richiesta di vita che posso determinare se una richiesta è per una risorsa statica o no, e come è possibile andare a questo proposito?

E 'forse possibile derivare da o gancio in System.Web.Routing.RouteTable e chiamare il mio codice profiler da lì?

È stato utile?

Soluzione 3

ho provato si avvicina da una diversa angolazione e sono molto più felice con il risultato. In sostanza - il motivo per cui rilevare le richieste di risorse statiche quando si può semplicemente non e 'route' loro a tutti? In 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
}

Ora non ho più bisogno di verificare la presenza di richieste statiche, anche se io voglio per qualsiasi motivo posso ancora fare il seguente:

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]);
}

Dal momento che so con assoluta certamente ciò che gli unici percorsi sarò al contenuto statico da sono, questa sembra una soluzione abbastanza robusto. Sono ancora aperto ad altre idee, ma credo che questo adatta alle mie esigenze bene.

Altri suggerimenti

Ci sono varie opzioni. In primo luogo - per determinare il file statico utilizzando Request.PhysicalPath - check out: Verificare la presenza di un file statico durante Application_BeginRequest?

Un'alternativa sarebbe quella di avere questo come un gestore e utilizzare il percorso notare i tipi di file da includere (* aspx), ad esempio nel web.config. Poi si può avere accesso a eventi abbastanza presto (vedi asp.net gasdotto)

o semplicemente usare un HttpModule -. Controllare tutto e profilo solo gli elementi non fisici come si parla

In alternativa - utilizzare il metodo corrente con il primo collegamento a semplicemente controllare la Request.PhysicalPath e la speranza che funziona per voi:)

Avrei preferito utilizzare Filtri MVC per la profilatura in quanto i filtri MVC permettono di aggiungere comportamenti pre e post-elaborazione e filterContext parametro dovrebbe darvi abbastanza informazioni.

Per esempio, vorrei creare ProfilerAttribute per la profilatura

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");
    }
}

e registrarsi come GlobalFilter in Global.ascx ....

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

La speranza può aiutare. Grazie.

Aggiorna : dimenticato di dire che il filtro MVC solo eseguito dopo l'instradamento è abbinato. Quindi, non è necessario per filtrare per risorse statiche da quando è stato già fatto da MVC.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top