Зависит ли клиент проверки RequestFilter?

Следует ли ожидать проверки фильтра запроса (например, FluentValidation) срабатывать, когда создание справочной службы через AppHostBase.ResolveService<>?

До сих пор я успешно получал правильные ответы об ошибках в своем приложении C# только при использовании типизированного клиенты (в данном случае JsonServiceClient).


person Jeremy Smith    schedule 23.01.2014    source источник
comment
Я проверю сегодня днем.   -  person Jeremy Smith    schedule 26.01.2014
comment
protected IServiceController ServiceController на AppHostBase... не могу понять, как получить к этому доступ с контроллера MVC.   -  person Jeremy Smith    schedule 27.01.2014
comment
У меня есть вся ветка v3 на моей машине, и я не могу найти HostContext.ServiceController, расширение или что-то другое . ServiceStack.Common.HostContext   -  person Jeremy Smith    schedule 29.01.2014
comment
Джереми, я обновил свой ответ, включив в него метод v3, извините, я не знал, что вы используете v3, и предоставил инструкции для v4. Надеюсь это поможет.   -  person Scott    schedule 29.01.2014


Ответы (1)


Ты прав. Если вы попытаетесь использовать AppHostBase.ResolveService<T>, он не выполнит ни один из зарегистрированных фильтров запросов. По сути, он разрешает только службу из контейнера зависимостей AppHost, вы возвращаете только экземпляр службы. Таким образом, ваши валидаторы не срабатывают.

Сервисный стек v4:

Как указывает @mythz, вы можете использовать API точки входа MQ HostContext для выполнения вызова с фильтрами запросов MQ и, таким образом, для запуска проверки. Сделать это:

HostContext.ServiceController.ExecuteMessage(new Message<T>(requestDto), httpReq);

@mythz также отмечает, что вы можете выполнить службу, используя только DTO, вместо того, чтобы определять службу и метод обработки для вызова, но аналогично AppHostBase.ResolveService<T> он не запускает фильтры запросов. Использование:

HostContext.ServiceController.Execute(requestDto, httpReq)

Сервисный стек v3:

GetAppHost().Config.ServiceManager.ServiceController.ExecuteMessage(new Message<T>(requestDto), httpReq);
person Scott    schedule 23.01.2014
comment
Вы также можете вызвать службу только с запросом DTO с помощью: HostContext.ServiceController.Execute(requestDto, httpReq), это по-прежнему не выполняет глобальные фильтры запросов, но использует API точки входа MQ: HostContext.ServiceController.ExecuteMessage(new Message<T>(requestDto), httpReq) выполняет глобальные фильтры запросов MQ и выполняет Fluent Validation. - person mythz; 24.01.2014
comment
@mythz Это здорово. Я собираюсь как следует изучить исходный код HostContext; Вы уже дважды указали на замечательные функции, о которых я не знал. :) - person Scott; 24.01.2014
comment
что вы передаете как httpReq? - person Jeremy Smith; 30.01.2014
comment
@JeremySmith Если вы не передадите httpReq, я полагаю, что это разрешит контекст исходного запроса. Соответствующий код здесь. Так что просто попробуйте передать DTO. - person Scott; 30.01.2014
comment
Я подтвердил, что он запускает проверку по желанию. Как ни странно, это работает только для POST или ANY... выбрасывая Could not find method named Post(...) or Any(...) on Service ... для любого другого метода... хотя это работает, это немного неуклюже. Я, скорее всего, полностью избегаю проверки фильтра запросов и просто выполняю проверку в методах службы. Спасибо за раскрытие этого самородка! - person Jeremy Smith; 07.02.2014