11

是否有可能在没有重大黑客攻击的情况下在 Runner 中获取 ServiceStack 请求的原始请求正文?

我正在编写一个 oauth 服务提供程序,以使用新的 API(服务和运行程序)在 ServiceStack 之上运行。由于 OAuth 签名的工作方式,我需要获取每个请求的原始请求正文。OAuth 保护层被添加到 Runner 中,因此无效的 OAuth 请求可以轻松返回空/错误响应,而无需在 Service 类中使用任何样板或子类化特殊的“OAuthService”类。

4

1 回答 1

15

访问原始请求正文的方法是使用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因为它现在已缓冲。

于 2013-07-07T18:24:59.507 回答