ASP.NET MVC - Was ist der früheste Punkt im Anforderungszyklus, an dem Sie eine statische Ressourcenanforderung erkennen können?

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

Frage

Um der Frage einen Kontext zu geben, habe ich einen Profiler geschrieben, der auf application_BeginRequest aufgerufen wird, aber alles protokolliert (dh Javascripts, Bilder usw.). Während es als letzter Ausweg möglich wäre, dem Profiler -Client eine Filterung hinzuzufügen, würde ich den Profiler eher nur aktivieren, wenn festgestellt werden kann, dass die Anforderung Routing erfordert. Idealerweise wäre es in Application_BeginRequest, aber ich denke nicht, dass es ohne redundante Verarbeitung der eingehenden Anfrage zum Routing möglich wäre ...

Kurz gesagt, wann ist der früheste Punkt im Antragslebenszyklus, den ich feststellen kann, ob eine Anfrage für eine statische Ressource bestimmt ist oder nicht, und wie würden Sie sie vorgehen?

Ist es vielleicht möglich, aus dem System.web.routing.routetable abzuleiten und meinen Profilercode von dort anzurufen?

War es hilfreich?

Lösung 3

Ich habe versucht, es aus einem anderen Blickwinkel zu nähern, und bin mit dem Ergebnis viel glücklicher. Grundsätzlich - warum statische Ressourcenanfragen erkennen, wenn Sie sie überhaupt nicht „weiterleiten“ können? 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
}

Jetzt muss ich nicht mehr nach statischen Anfragen überprüfen, obwohl ich aus irgendeinem Grund immer noch Folgendes tun kann:

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

Da ich mit Absolute sicher weiß, was die einzigen Wege, von denen ich statische Inhalte bedienen werde, ist dies wie eine ziemlich robuste Lösung. Ich bin immer noch offen für andere Ideen, aber ich denke, das passt zu meinen Bedürfnissen.

Andere Tipps

Es gibt verschiedene Optionen. Zunächst - um die statische Datei mit Request.physicalPath zu bestimmen - Schauen Sie sich an:Überprüfen Sie während der Anwendung_BeginRequest nach einer statischen Datei?

Eine Alternative wäre, diese als Handler zu haben und den Pfad zu verwenden, um die Dateitypen zu notieren, um (*.aspx) beispielsweise in Ihrem Web.config zu notieren. Dann können Sie ziemlich früh auf Ereignisse zugreifen (siehe ASP.NET Pipeline)

Oder verwenden Sie einfach ein httpmodule - überprüfen Sie alles und profilieren Sie nur die nicht -physischen Elemente, wie Sie erwähnt werden.

Oder - Verwenden Sie Ihre aktuelle Methode mit dem ersten Link, um Request.physicalPath und hoffe, dass dies für Sie funktioniert :)

Ich würde lieber benutzen MVC -Filter zum Profilerstellen, da MVC-Filter das Verhalten vor und nach der Verarbeitung hinzufügen können und filtercontext Der Parameter sollte Ihnen genügend Informationen geben.

Zum Beispiel würde ich ProfilerAttribute zum Profilerstellen erstellen

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

und registrieren Sie sich als GlobalFilter in Global.ascx....

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

Hoffe es kann helfen. Vielen Dank.

aktualisieren: Vergessen zu erwähnen, dass der MVC -Filter nur ausgeführt wurde nach Das Routing ist abgestimmt. Sie müssen also nicht nach statischen Ressourcen herausfiltern, da dies bereits von MVC durchgeführt wurde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top