2013-07-07 6 views
11

Возможно ли, без серьезного хакерства, получить необработанный запрос запроса ServiceStack в Runner?Может ли ServiceStack Runner получить тело запроса?

Я пишу поставщика услуг oauth для запуска поверх ServiceStack с использованием нового API (Service and Runner). Из-за того, как работает OAuth, мне нужно получить необработанное тело запроса для каждого запроса. Защитный слой OAuth добавляется в Runner, так что неверный запрос OAuth может легко вернуть пустой/ошибочный ответ без какого-либо шаблона в классе Service или подклассифицировать специальный класс «OAuthService».

ответ

15

Путем доступа к органу необработанных запросов следует использовать IHttpRequest.GetRawBody() или читать с IHttpRequest.InputStream.

Но поскольку тело запроса HTTP является потоком только для прямого доступа, по умолчанию его можно вызывать только один раз, который обычно вызывается ServiceStack для десериализации запроса DTO. Serialization and Deserialization docs показать, как сказать ServiceStack пропустить десериализации запроса и ввести непрочитанный запрос поток в DTO Запроса с:

public class Hello : IRequiresRequestStream 
{ 
    /// <summary> 
    /// The raw Http Request Input Stream 
    /// </summary> 
    Stream RequestStream { get; set; } 
} 

Если вы все еще хотите ServiceStack десериализации запроса DTO, но и получить доступ к необработанному телу запроса вам нужно сказать ServiceStack в буфер запроса до его чтения, которые вы можете сделать, добавив PreRequestFilter:

appHost.PreRequestFilters.Insert(0, (httpReq, httpRes) => { 
    httpReq.UseBufferedStream = true; 
}); 

который теперь позволяет назвать httpReq.GetRawBody() несколько раз или читать прямо из IHttpRequest.InputStream, так как он теперь буфера.

+0

Это более или менее то, что я делаю уже, но мне пришлось использовать отражение, чтобы получить IHttpRequest из IRequestContext, который я бы предпочел не делать по понятным причинам. Есть ли способ захватить IHttpRequest изнутри IServiceRunner . Выполнить метод? –

+1

Отражение? Просто выполните 'requestContext.Get ()', чтобы получить запрос. – mythz

+0

@mythz безопасно делать 'httpReq.UseBufferedStream = true;' в производстве? Или это обычно не рекомендуется? – vonec

Смежные вопросы