ASP.NET MVC - quel est le point plus tôt dans le cycle de demande où vous pouvez détecter une demande de ressource statique?

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

Question

Pour donner à la question un certain contexte, je l'ai écrit un profileur qui est appelé Application_BeginRequest, mais il est tout l'exploitation forestière (c.-à-javascripts, images, etc.). Bien qu'il serait possible en dernier recours pour ajouter le filtrage au client de profileur, je préfère largement que activer le profileur quand il peut être déterminé que la demande nécessite le routage. Idéalement, il serait Application_BeginRequest mais je ne pense pas qu'il serait possible sans traitement redondant de la requête entrante pour le routage ...

Donc en bref, quand est le plus tôt dans le cycle de vie de la demande que je peux déterminer si une demande est pour une ressource statique ou non, et comment iriez-vous à ce sujet?

Est-il peut-être possible de dériver ou crochet dans System.Web.Routing.RouteTable et appeler mon code profileur à partir de là?

Était-ce utile?

La solution 3

Je l'ai essayé approcher sous un angle différent et je suis beaucoup plus heureux avec le résultat. Fondamentalement - pourquoi détecter les demandes de ressources statiques lorsque vous ne pouvez tout simplement pas les « itinéraire » du tout? 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
}

Maintenant, je ne avez plus besoin de vérifier les demandes statiques, bien que si je ne veux pour une raison quelconque, je peux encore faire ce qui suit:

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

Depuis que je sais avec absolu certainement ce que les seuls chemins que je vais servir du contenu de statique sont, cela semble être une solution assez robuste. Je suis toujours ouvert à d'autres idées mais je pense que cela convient bien à mes besoins.

Autres conseils

Il existe différentes options. Tout d'abord - pour déterminer le fichier statique à l'aide Request.PhysicalPath - consultez: Vérifiez un fichier statique pendant Application_BeginRequest?

Une alternative serait d'avoir cela comme un gestionnaire et utiliser le chemin de noter les types de fichiers à inclure (* .aspx), par exemple dans votre web.config. Ensuite, vous pouvez avoir accès à des événements assez tôt (voir pipeline asp.net)

Ou tout simplement utiliser un HttpModule -. Tout chèque et profil uniquement les éléments non-physiques que vous mentionnez

Ou - utilisez votre méthode actuelle avec le premier lien simplement vérifier Request.PhysicalPath et l'espoir qui vous convient:)

Je préférerais utiliser Filtres MVC pour le profilage puisque filtres MVC permettent d'ajouter des comportements pré et post-traitement et filterContext paramètre devrait vous donner suffisamment d'informations.

Par exemple, je voudrais créer ProfilerAttribute pour établir le profil

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

et inscrivez-vous GlobalFilter Global.ascx ....

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

L'espoir peut aider. Merci.

update : Mot de mentionner que le filtre MVC exécutée uniquement après l'acheminement est mis en correspondance. , Vous n'avez pas besoin ainsi filtrer les ressources statiques, car il a déjà été fait par MVC.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top