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