【问题标题】:Can ServiceStack Runner Get Request Body?ServiceStack Runner 可以获取请求正文吗?
【发布时间】:2013-07-05 02:00:53
【问题描述】:

是否有可能在 Runner 中获取 ServiceStack 请求的原始请求主体,而无需大费周章?

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

【问题讨论】:

    标签: c# oauth servicestack


    【解决方案1】:

    访问原始请求正文的方法是使用IHttpRequest.GetRawBody()或从IHttpRequest.InputStream读取。

    但是由于 HTTP 请求体是一个只转发的流,默认情况下它只能被调用一次,通常由 ServiceStack 调用来反序列化请求 DTO。 Serialization and Deserialization docs 展示了如何告诉 ServiceStack 跳过反序列化请求并将未读请求流注入到请求 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 读取,因为它现在已缓冲。

    【讨论】:

    • 这或多或少是我已经在做的事情,但我不得不使用反射从 IRequestContext 获取 IHttpRequest,出于明显的原因,我不想这样做。有没有办法从 IServiceRunner.Execute 方法中获取 IHttpRequest?
    • 反思?只需执行requestContext.Get&lt;IHttpRequest&gt;() 即可获取请求。
    • @mythz 在生产环境中使用httpReq.UseBufferedStream = true; 是否安全?还是通常不推荐这样做?
    • @vonec 没关系,它只是缓冲请求流,因此可以重新读取请求正文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2011-06-14
    • 2014-08-01
    相关资源
    最近更新 更多