加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – ServiceStack Runner获取请求体?

发布时间:2020-12-15 18:02:58 所属栏目:百科 来源:网络整理
导读:在没有主要的骇客的情况下,是否可以在Runner中获取ServiceStack请求的原始请求正文? 我正在编写一个oauth服务提供商,使用新的API(Service and Runner)运行在ServiceStack之上.由于OAuth签名的工作原理,我需要为每个请求获取原始请求正文. OAuth保护层被添加
在没有主要的骇客的情况下,是否可以在Runner中获取ServiceStack请求的原始请求正文?

我正在编写一个oauth服务提供商,使用新的API(Service and Runner)运行在ServiceStack之上.由于OAuth签名的工作原理,我需要为每个请求获取原始请求正文. OAuth保护层被添加到Runner,这样一个无效的OAuth请求可以很容易地返回一个空的/错误的响应,而没有Service类中的任何样板或子类化一个特殊的“OAuthService”类.

解决方法

访问原始请求体的方式是使用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反序列化请求DTO,还可以访问原始请求正文,您需要告诉ServiceStack在读取之前缓存请求,您可以通过添加PreRequestFilter来执行此操作:

appHost.PreRequestFilters.Insert(0,(httpReq,httpRes) => {
    httpReq.UseBufferedStream = true;
});

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读