2013-07-08 3 views
5

Что было бы самым простым способом настроить перехватчик запросов/ответов в ServiceStack, который будет выполняться для конкретной службы?Глобальный запрос/ответный перехватчик

Фильтр запросов (IHasRequestFilter) работает нормально, но фильтр ответа (IHasResponseFilter) не запускается, если служба возвращает код состояния 2xxx. Мне нужно получить код состояния, возвращаемый методом, а также ответ DTO (если есть).

Обычай ServiceRunner и опрокинув OnBeforeExecute и OnAfterExecute методы, кажется, работает хорошо, но я нахожу это довольно навязчивым, как необходимо заменить для всего приложения бегун службы, и я не мог найти способ чистый способ изолировать на функциональность задачи, которые должны выполняться в этих методах.

Есть ли какая-либо точка расширения в ServiceStack, которая у меня отсутствует, что позволит мне выполнить некоторый код перед каждым методом службы и после каждого метода службы? Плагин был бы идеальным, но как я могу подписаться на некоторые фиктивные методы BeforeExecute и AfterExecute, которые позволили бы мне запустить какой-то пользовательский код?


UPDATE:

Сразу после размещения вопроса я узнал, что глобальные фильтры ответа не выполняется независимо от того, какого статуса коды возвращаются службой, которая именно то, что мне было нужно. Итак, последний вопрос: возможно ли получить тип сервиса, который будет обрабатывать запрос в фильтре запроса? Мне нужно проверить, украшена ли эта услуга каким-либо специальным атрибутом маркера.

ответ

3

я обнаружил решение на мой вопрос о том, как получить тип сервиса в фильтре пользовательский запрос/ответ:

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

    ... 
} 
+0

Да, я был просто посредине, отвечая на вопрос Q, указывающий на метаданные :) Также вы можете просмотреть метаданные ServiceStack с помощью пути [/operations/metadata](http://razor.servicestack.net/operations/metadata) , – mythz

2

IHttpRequest имеет OperationName. Я думаю, это то, что вам нужно.

+0

Нет, это не то, что мне нужно. Мне нужен тип сервиса ('System.Type'), чтобы я мог читать любые возможные пользовательские атрибуты, которые эта служба могла быть украшена. Я уже нашел решение и опубликую его как ответ. –

3

обычай ServiceRunner и переопределение методов OnBeforeExecute и OnAfterExecute, кажется, работает хорошо, но я нахожу это довольно навязчивым, как необходимость обслуживания бегуна заменить для всего приложения

Краткое примечание, вы можете выбрать в и только выбрать, какие запросы должны использовать пользовательские службы бегун, например:

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