2013-07-08 14 views
5

Jaki byłby najprostszy sposób ustawienia przechwytywacza żądania/odpowiedzi w ServiceStack, który byłby wykonywany dla konkretnej usługi?Globalny moduł przechwytujący żądania/odpowiedzi

Filtr żądania (IHasRequestFilter) działa poprawnie, ale filtr odpowiedzi (IHasResponseFilter) nie jest wyzwalany, jeśli usługa zwraca kod stanu innego niż 2xx. Muszę pobrać kod statusu zwrócony przez metodę oraz DTO odpowiedzi (jeśli istnieje).

Niestandardowy ServiceRunner i nadpisanie metody OnBeforeExecute i OnAfterExecute metod wydaje się działać dobrze, ale uważam, że to dość nachalny jak trzeba biegacz usługa zastępuje dla całej aplikacji i nie mogłem znaleźć sposób, czysty sposób izolowania za funkcjonalność zadania, które należy wykonać w tych metodach.

Czy jest jakiś punkt rozszerzenia w ServiceStack, którego mi brakowało, co pozwoliłoby mi na wykonanie kodu przed każdą metodą usługi i po każdej metodzie usługi? Wtyczka byłaby idealna, ale jak mogę zapisać się do niektórych fikcyjnych metod, które pozwoliłyby mi uruchomić niestandardowy kod?


UPDATE:

Tuż po zaksięgowaniu pytanie okazało się, że filtry globalnej reakcji są realizowane bez względu na to, jaki status code jest zwracany przez usługę, która jest dokładnie to, co potrzebne. Ostatnie pytanie: Czy możliwe jest pobranie typu usługi, który obsłuży żądanie w filtrze żądania? Muszę sprawdzić, czy ta usługa jest ozdobiona jakimś niestandardowym atrybutem znacznika.

Odpowiedz

3

znalazłem się rozwiązanie na moje pytanie o tym, jak odzyskać typ usługi w filtrze zwyczaj żądania/odpowiedzi:

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

    ... 
} 
+0

Tak, byłem właśnie w środku odpowiadając na Q wskazując na metadane :) Możesz również wyświetlić metadane ServiceStack na trasie [/operations/metadata](http://razor.servicestack.net/operations/metadata) . – mythz

2

IHttpRequest ma nazwę OperationName. Myślę, że to, czego szukasz.

+0

Nie, to nie jest to, czego szukam. Potrzebuję typu usługi ("System.Type"), aby móc odczytać wszelkie możliwe niestandardowe atrybuty, które mogły zostać ozdobione przez tę usługę. Znalazłem rozwiązanie i ogłosimy to jako odpowiedź. –

3

zwyczaj ServiceRunner i przesłanianie metod OnBeforeExecute i OnAfterExecute wydaje się działać porządku, ale uważam, że to dość nachalny jak konieczność płozy usługa zastępuje dla całej aplikacji

Szybka uwaga, można zrezygnować i wybrać tylko to, co wnioski powinny użyć niestandardowego biegacza usług, np:

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