ASP.NET MVC - ¿Cuál es el punto más temprano en el ciclo de solicitud donde puede detectar una solicitud de recursos estáticos?

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

Pregunta

Para darle a la pregunta un contexto, he escrito un perfilador que se llama en Application_BeginRequest, pero está registrando todo (es decir, JavaScripts, imágenes, etc.). Si bien sería posible como último recurso agregar filtrado al cliente Profiler, preferiría activar el perfilador cuando se pueda determinar que la solicitud requiere enrutamiento. Idealmente, sería en Application_BeginRequest, pero no creo que sea posible sin el procesamiento redundante de la solicitud entrante de enrutamiento ...

En resumen, ¿cuándo es el punto más temprano del ciclo de vida de solicitud que puedo determinar si una solicitud es para un recurso estático o no, y cómo lo haría?

¿Es quizás posible derivar o engancharse al sistema.web.routing.routetable y llamar a mi código de perfilador desde allí?

¿Fue útil?

Solución 3

He intentado abordarlo desde un ángulo diferente y estoy mucho más feliz con el resultado. Básicamente, ¿por qué detectar solicitudes de recursos estáticos cuando simplemente no puede 'enrutarlas' en absoluto? En 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
}

Ahora ya no necesito verificar las solicitudes estáticas, aunque si quiero por alguna razón, todavía puedo hacer lo siguiente:

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

Dado que sé con absolutamente cuáles son los únicos caminos de los que serviré contenido estático, esto parece una solución bastante robusta. Todavía estoy abierto a otras ideas, pero creo que esto se adapta bien a mis necesidades.

Otros consejos

Hay varias opciones. Primero: para determinar el archivo estático usando request.physicalpath - consulte:¿Verifica un archivo estático durante la aplicación_beginRequest?

Una alternativa sería tener esto como controlador y usar la ruta para notar los tipos de archivos para incluir (*.aspx), por ejemplo, en su web.config. Entonces puede tener acceso a eventos bastante temprano (ver ASP.NET Pipeline)

O simplemente use un httpmodule: verifique todo y solo perfile los elementos no físicos como usted menciona.

O: use su método actual con el primer enlace para simplemente verificar request.physicalpath y espero que funcione para usted :)

Prefiero usar Filtros MVC para perfilar ya que los filtros MVC permiten agregar comportamientos previos y posteriores al procesamiento y FilterContext El parámetro debe brindarle suficiente información.

Por ejemplo, crearía ProfilerAttribute para el perfil

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

y registrarse como GlobalFilter en Global.ASCX....

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

Espero que pueda ayudar. Gracias.

actualizar: Olvidé mencionar que el filtro MVC solo ejecutado después El enrutamiento se combina. Por lo tanto, no necesita filtrar para recursos estáticos ya que ya lo realizó MVC.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top