Ответ 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
, поскольку он теперь буферизирован.