Доступ к запросу, ответу, сервису и контексту БД и т. д. в ServiceStack

В моем предыдущем проекте я использую структуру (Agatha RRSL), похожую на ServiceStack, в которой все состоит из запроса, ответа и обработчика. У него также есть перехватчики, которые могут подключаться к обработчику, и вы также можете внедрять другие интерфейсы в обработчик. Я могу использовать это, чтобы открыть транзакцию BeforeHandling, получить доступ как к запросу, так и к ответу в AfterHandling, создать аудит, сохранить в базе данных и закрыть транзакцию, если это необходимо.

Пытаюсь поэкспериментировать аналогично с SerivceStack. Но, кажется, с фильтрами я не могу собрать запрос и ответ вместе?

С пользовательским ServiceRunner. Когда я пытаюсь отлаживать OnAfterExecute(...), я вижу имя моего запроса dto в IRequestContext {ServiceStack.ServiceHost.HttpRequestContext}. Но только имя, я не мог понять, как получить фактический объект запроса для работы с объектом ответа.

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

Наконец, кажется, я могу зарегистрировать только один пользовательский сервис? С Interceptor я могу сбросить их кучу, и они будут обвиваться друг вокруг друга.

есть идеи? Спасибо


person Whoever    schedule 10.10.2013    source источник


Ответы (1)


RequestContext также содержит HttpRequest и HttpResponse, к которым вы можете получить доступ:

var httpReq = RequestContext.Get<IHttpRequest>();
var httpRes = RequestContext.Get<IHttpResponse>();

См. документацию по Доступ к специальным функциям HTTP для больше информации.

person mythz    schedule 10.10.2013
comment
Спасибо. Кажется, это HttpRequest. Как получить исходный запрос Dto? В идеале из ResponseFilter, а не из службы запуска. Смотрел в отладчике почти все, так и не смог разобраться. - person Whoever; 10.10.2013
comment
Фильтры ответов @Whoever воздействуют на ответы, поэтому им предоставляется DTO ответа. Если вам нужно передавать метаданные по всему конвейеру запросов, вместо этого рекомендуется использовать Request.Items. Хотя запрос DTO доступен с помощью RequestContext.Dto. - person mythz; 10.10.2013
comment
Все еще не понял, как получить доступ к RequestContext.Dto, какие-нибудь подсказки? Я пытаюсь получить доступ к пользовательским атрибутам аудита по запросу dto в сочетании с результатом в ответе dto и создать объект аудита. Например, вход пользователя xyz, успех/неудача и т. д. Итак, мне нужен исходный запрос Dto в последней половине конвейера, либо в OnAfterExecute, либо в ResponseFilterAttribute. - person Whoever; 10.10.2013
comment
Так что там на RequestContext.Dto? И, как я уже сказал, вы можете передавать любые данные (включая запрос DTO), используя Request.Items, который доступен во всем конвейере запросов. - person mythz; 10.10.2013
comment
Извините, пропустил какой-то актерский состав. Наконец-то удалось передать запрос dto в фильтр ответов и получить все настраиваемые атрибуты. Я думаю, единственное неудобство заключается в том, что вы должны применять фильтры парами. Говоря об этом, если оба фильтра запросов/ответов добавлены поверх HelloService, как показано в вики, фильтр ответов не сработает. Мне нужно переместить фильтр ответа на объект Any (Hello request). Не уверен, что это так задумано, или я что-то упускаю. Ничего страшного, поскольку они, вероятно, должны быть в dto в любом случае. Я думаю, что нашел почти все, что мне нужно, и готов к реальным действиям! - person Whoever; 10.10.2013
comment
Некоторые случайные мысли, может быть, кастомный сервисный раннер можно прикрепить к основному раннеру, а не заменить его? Затем вы можете зарегистрировать их кучу и запускать последовательно, как упомянутый мной обработчик. Кажется более удобным способом добавить код стиля аспекта по сравнению с фильтрами. Хотя я недостаточно знаю, чтобы сказать, лучший ли это подход, и потенциальный выпадение. Еще одна забавная особенность Agatha заключается в том, что сервис принимает массив запросов и возвращает массив ответов. Таким образом, вы можете объединять несколько разных запросов в одном круговом цикле, что кажется забавным. Еще раз спасибо за отличную работу! - person Whoever; 10.10.2013
comment
@Whoever Примечание: вам нужно вызвать базовый класс при переопределении ServiceRunner, если вы хотите сохранить существующее поведение. Что касается пакетной обработки, было бы идеально придумать универсальное решение, чтобы вы могли бесплатно использовать функциональные возможности существующих Сервисов. Лучше всего отправить запрос функции для этого, чтобы мы могли измерить интерес и соответствующим образом расставить приоритеты. . - person mythz; 11.10.2013
comment
Спасибо, пока остановился на настраиваемых атрибутах по запросу dto плюс глобальный фильтр. - person Whoever; 11.10.2013