Может ли ServiceStack Runner получить тело запроса?

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

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

Ответ 1

Способ доступа к Органу необработанного запроса - использовать IHttpRequest.GetRawBody() или читать из IHttpRequest.InputStream.

Но поскольку тело HTTP-запроса является потоком только для прямого доступа, по умолчанию его можно вызывать только один раз, который обычно вызывается ServiceStack для десериализации запроса DTO. Документы сериализации и десериализации показывают, как сообщить 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, поскольку он теперь буферизирован.