2013-07-08 19 views
5

Quale sarebbe il modo più semplice per configurare un intercettore richiesta/risposta in ServiceStack che verrebbe eseguito per un particolare servizio?Intercettore di richiesta/risposta globale

Un filtro di richiesta (IHasRequestFilter) funziona correttamente ma un filtro di risposta (IHasResponseFilter) non viene attivato se il servizio restituisce codice di stato non 2xx. Devo recuperare il codice di stato restituito dal metodo e il DTO della risposta (se presente).

A ServiceRunner costume e sovrascrivendo il OnBeforeExecute e OnAfterExecute metodi sembra funzionare bene ma io lo trovo abbastanza invadente come il corridore di servizio devono essere sostituiti per l'intera applicazione e non sono riuscito a trovare un modo modo pulito per isolare ogni funzionalità le attività che devono essere eseguite con questi metodi.

C'è qualche punto di estensione in ServiceStack che mi manca che mi permetterebbe di eseguire del codice prima di ogni metodo di servizio e dopo ogni metodo di servizio? Un plugin sarebbe l'ideale, ma come posso iscrivermi ad alcuni metodi fittizi BeforeExecute e AfterExecute che mi consentirebbero di eseguire un codice personalizzato?


UPDATE:

Subito dopo la pubblicazione della domanda ho scoperto che i filtri di risposta globali vengono eseguiti non importa quale codice di stato restituito dal servizio che è esattamente quello che mi serviva. Quindi un'ultima domanda: è possibile recuperare il tipo di servizio che gestirà la richiesta in un filtro di richiesta? Devo controllare se questo servizio è decorato da un attributo indicatore personalizzato.

risposta

3

Ho trovato una soluzione alla mia domanda su come recuperare il tipo di servizio in un filtro di richiesta custom/risposta:

appHost.RequestFilters.Add((req, res, requestDto) => 
{ 
    var metadata = EndpointHost.Metadata; 
    Type serviceType = metadata.GetServiceTypeByRequest(requestDto.GetType()); 

    ... 
} 
+0

Sì, ero proprio nel mezzo di rispondere a una Q che ti indicava i metadati :) Inoltre puoi anche visualizzare i metadati che ServiceStack ha con la rotta [/operations/metadata](razon.servicestack.net/operations/metadata) . – mythz

2

IHttpRequest ha OperationName. Penso che sia quello che stai dopo.

+0

No, non è quello che sto dopo. Ho bisogno del tipo di servizio ('System.Type') in modo da poter leggere tutti gli attributi personalizzati che questo servizio potrebbe essere stato decorato con. Ho già trovato una soluzione e la pubblicherò come risposta. –

3

A ServiceRunner costume e sovrascrivendo i metodi OnBeforeExecute e OnAfterExecute sembra funzionare bene, ma lo trovo abbastanza invadente come la necessità di servizio corridore da sostituire per l'intera applicazione

nota rapida, è possibile opt-in e scegliere solo ciò che le richieste dovrebbero usare un corridore di servizio personalizzato, ad esempio:

public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(
    ActionContext actionContext) 
{   
    return useCustomRunner(actionContext.RequestType) 
     ? new MyServiceRunner<TRequest>(this, actionContext) 
     : base.CreateServiceRunner<TRequest>(actionContext); 
} 
Problemi correlati