gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:42:00 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com