是否有可能在没有重大黑客攻击的情况下在 Runner 中获取 ServiceStack 请求的原始请求正文?
我正在编写一个 oauth 服务提供程序,以使用新的 API(服务和运行程序)在 ServiceStack 之上运行。由于 OAuth 签名的工作方式,我需要获取每个请求的原始请求正文。OAuth 保护层被添加到 Runner 中,因此无效的 OAuth 请求可以轻松返回空/错误响应,而无需在 Service 类中使用任何样板或子类化特殊的“OAuthService”类。
是否有可能在没有重大黑客攻击的情况下在 Runner 中获取 ServiceStack 请求的原始请求正文?
我正在编写一个 oauth 服务提供程序,以使用新的 API(服务和运行程序)在 ServiceStack 之上运行。由于 OAuth 签名的工作方式,我需要获取每个请求的原始请求正文。OAuth 保护层被添加到 Runner 中,因此无效的 OAuth 请求可以轻松返回空/错误响应,而无需在 Service 类中使用任何样板或子类化特殊的“OAuthService”类。
访问原始请求正文的方法是使用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
因为它现在已缓冲。