c# - ServiceStack Runner 能否获取请求体?

标签 c# oauth servicestack

是否有可能在没有重大黑客攻击的情况下,在 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/

相关文章:

c# - DllImport - 尝试加载格式不正确的程序

servicestack - RouteAttribute, AttributeUsage, Inherited = true

session - ServiceStack:在自托管应用程序中访问 HttpRequest

c# - 如何创建一个可以在其中放置其他控件的 UserControl?

c# - 如何保存已编辑的 pdf?

c# - 在 C# 中将一个 ulong 解析为两个 uint 变量

iphone - 保护移动设备和 Web 服务之间连接的协议(protocol)?

javascript - OAuth弹窗跨域安全React.js

scala - 使用 Play 框架在 Scala 中编写我的 API。实现 OAuth 的最简单方法是什么?

optimization - 随时间收集服务性能指标