Intercettare tutte le WebApi chiamate prima il percorso di corrispondenza si verifica

Sto cercando un modo per intercettare/afferrare la richiesta prima di effettuare l’abbinamento di un percorso. Per esempio, ho più controller e rotte, ma voglio qualche meccanismo in cui sarà colpito prima il metodo della rotta viene colpito. Sarebbe preferibile se questo meccanismo sono stati in grado di ottenere il percorso parametri che sono stati inviati.

Sono stato in grado di trovare qualcosa di simile a quello che sto cercando (ma forse non essendo esperto in Web API sono alla ricerca con le parole chiave sbagliate).

Si potrebbe guardare nel Application_BeginRequest nel mondiale.asax.

OriginaleL’autore Luke G | 2015-10-29

4 Replies
  1. 7

    Di che cosa avete bisogno, è l’azione dei filtri. È possibile applicare l’azione dei filtri direttamente al controller come attributi, l’avvertenza con l’Azione dei filtri è che a questo punto il controller percorso è già noto, ma si può ancora controllare (molto simili AOP) se il metodo di azione può essere eseguita o non:

    ASP.NET Web API ActionFilter esempio

    Occhiata a come si può utilizzare un’azione di filtro, in questo caso per la registrazione:

    public class LogActionFilter : ActionFilterAttribute 
    {
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            Log(actionExecutedContext.ActionContext.RequestContext.RouteData);
    
            base.OnActionExecuted(actionExecutedContext);
        }
    
        private void Log(System.Web.Http.Routing.IHttpRouteData httpRouteData)
        {
            var controllerName = "controller name";
            var actionName = "action name";
            var message = String.Format("controller:{0}, action:{1}", controllerName, actionName);
    
        Debug.WriteLine(message, "Action Filter Log");
        }
    }

    Come accedere la quale metodo di azione è eseguita in un controller di webapi

    È inoltre possibile utilizzare i gestori di messaggi, che vengono eseguiti prima che il controllore è stato risolto:

    Messaggio HTTP Gestori ASP.NET Web API

    I am looking for a way to intercept/grab the request being made before matching to a route — azione filtri verificarsi dopo un percorso che è stato abbinato, no? Potrebbe anche essere il caso che la domanda è solo non è abbastanza chiaro per fornire una risposta adeguata
    Se questo è ciò che si desidera, è possibile utilizzare il gestore di messaggi, che cosa è necessario fare prima il percorso è scoperto?
    Sto solo citando una parte della domanda dell’OP, perché penso che la tua risposta potrebbe avere perso che aspetto 🙂
    Forse ho misspoke detto prima della partita succede. Quello che voglio dire è prima il metodo che corrisponde, è chiamato. In questo caso sono stato in grado di utilizzare ‘OnActionExecuting’ per colpire quel blocco di codice prima del metodo all’interno del controller è chiamato. Questo è esattamente ciò che era necessario, e sembrava essere la migliore soluzione per me
    Per la maggior parte dei casi l’azione del filtro vanno bene, contento di aver potuto aiutare 🙂

    OriginaleL’autore MeTitus

  2. 4

    Sto usando menzionato tecnica di registrazione di tutte le richieste e le risposte.
    Parlando poco, il modo migliore per farlo è quello di utilizzare i Gestori.

    Primo, creare gestore:

    public class CustomHandler : DelegatingHandler
    {
        protected override async Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
            //get route values and process them
            var routeValues = (IHttpRouteData[]) HttpContext.Current.Request.RequestContext.RouteData.Values["MS_SubRoutes"];
    
            //let other handlers process the request
            return await base.SendAsync(request, cancellationToken)
                .ContinueWith(task =>
                {
                    //once response is ready, do something with it                                        
    
                    return task.Result;
                }, cancellationToken);
        }
    }

    Quindi, di registrarlo in WebApiConfig:

    config.MessageHandlers.Add(new CustomHandler());
    Se si utilizza delegato gestori di registro di tutte le richieste anche di registro non valido richieste, se ti serve solo per la registrazione si deve usare l’azione di filtri non gestori.
    quelli interessati anche a me 🙂
    Entrambi consentono di accedere alle tue richieste, ma con l’azione dei filtri è più facile per voi per registrare solo i dati significativi 🙂
    questo non funziona con mvc6

    OriginaleL’autore balbelias

  3. 0

    Dovrebbe lavorare per creare un HttpHandler (o di farlo solo in Global asax Application_BeginRequest evento) per acquisire le richieste e all’interno del gestore di analizzare l’URL contro itinerario config, simile a questo link.

    Si hanno modi migliori per raggiungere questo con ciò che il Web API.

    OriginaleL’autore Martin Staufcik

  4. 0

    Come Joel Etherton accennato nei commenti, io credo che quello che cerchi è qualcosa di simile, aggiungere il seguente codice nella vostra globale.asax:

    protected void Application_EndRequest()
    {
        /*
        if(HttpContext.Current.Response.StatusCode == 404)
            Debug.WriteLine("404 something something")
        if(HttpContext.Current.Response.StatusCode == 500)
            Debug.WriteLine("500 something something")
        if(HttpContext.Current.Response.StatusCode == 200)
            Debug.WriteLine("200 something something")
        */
        Debug.WriteLine($"{context.Response.StatusCode} - {request.Url.PathAndQuery}");
    }

    Ho preso ispirazione da qui: ASP.NET MVC Errore 404 Gestione

    OriginaleL’autore hormberg

Lascia un commento