servicestack,C#,Oauth,servicestack" /> servicestack,C#,Oauth,servicestack" />

C# ServiceStack运行程序能否获取请求正文?

C# ServiceStack运行程序能否获取请求正文?,c#,oauth,servicestack,C#,Oauth,servicestack,在没有重大黑客攻击的情况下,是否有可能在运行程序中获取ServiceStack请求的原始请求体 我正在编写一个oauth服务提供程序,使用新的API(服务和运行程序)在ServiceStack之上运行。由于OAuth签名的工作方式,我需要获得每个请求的原始请求体。OAuth保护层被添加到运行程序中,因此无效的OAuth请求可以轻松返回空/错误响应,而无需服务类中的任何样板文件或特殊的“OAuthService”类的子类。访问原始请求正文的方法是使用IHttpRequest.GetRawBody(

在没有重大黑客攻击的情况下,是否有可能在运行程序中获取ServiceStack请求的原始请求体


我正在编写一个oauth服务提供程序,使用新的API(服务和运行程序)在ServiceStack之上运行。由于OAuth签名的工作方式,我需要获得每个请求的原始请求体。OAuth保护层被添加到运行程序中,因此无效的OAuth请求可以轻松返回空/错误响应,而无需服务类中的任何样板文件或特殊的“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; }
}

现在可以多次调用
httpReq.GetRawBody()
,或者直接从
IHttpRequest.InputStream
读取,因为它现在已被缓冲。

这或多或少是我已经在做的事情,但我不得不使用反射从IRequestContext获取IHttpRequest,出于明显的原因,我不想这样做。有没有办法从IServiceRunner.Execute方法内部获取IHttpRequest?反射?只需执行
requestContext.Get()
即可获取请求。@执行
httpReq.UseBufferedStream=true是否安全在生产中?或者这不是通常推荐的吗?@vonec没关系,它只是缓冲请求流,以便可以重新读取请求正文。
appHost.PreRequestFilters.Insert(0, (httpReq, httpRes) => {
    httpReq.UseBufferedStream = true;
});