是否有可能在没有重大黑客攻击的情况下,在 Runner 中获取 ServiceStack 请求的原始请求主体?
我正在编写一个 oauth 服务提供程序,以使用新的 API(服务和运行程序)在 ServiceStack 之上运行。由于 OAuth 签名的工作方式,我需要为每个请求获取原始请求正文。 OAuth 保护层被添加到 Runner,以便无效的 OAuth 请求可以轻松返回空/错误响应,而无需服务类中的任何样板或子类化特殊的“OAuthService”类。
最佳答案
获取Raw Request Body的方法是使用IHttpRequest.GetRawBody()
或者从IHttpRequest.InputStream
中读取。
但由于 HTTP 请求主体是一个只转发流,默认情况下它只能被调用一次,通常由 ServiceStack 调用以反序列化请求 DTO。 Serialization and Deserialization docs显示如何告诉 ServiceStack 跳过反序列化请求并将未读的请求流注入(inject)到请求 DTO 中:
public class Hello : IRequiresRequestStream
{
/// <summary>
/// The raw Http Request Input Stream
/// </summary>
Stream RequestStream { get; set; }
}
如果您仍然希望 ServiceStack 反序列化 Request DTO,但也访问原始请求主体,您需要告诉 ServiceStack 在读取之前缓冲请求,您可以通过添加 PreRequestFilter 来实现:
appHost.PreRequestFilters.Insert(0, (httpReq, httpRes) => {
httpReq.UseBufferedStream = true;
});
现在允许您多次调用 httpReq.GetRawBody()
或直接从 IHttpRequest.InputStream
读取,因为它现在已被缓冲。
关于c# - ServiceStack Runner 能否获取请求体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17514754/