如何使用service -ack将原始类型设置为application / x-www-form-urlencoded来获取原始请求正文?

时间:2017-08-21 08:37:05

标签: request servicestack

我有我的DTO

Route("/testing","POST")]
public class TestingRequest:IRequiresRequestStream
{
    public Stream RequestStream { get; set; }
}

和我的服务

public async Task<object> Post(TestingRequest req)
{
    var rawbody = base.Request.GetRawBody();
    var data = req.RequestStream.ReadFully();
    var strdata = UTF8Encoding.UTF8.GetString(data);
    ...
}

我发现在调用它时,只有当content-type不是application / x-www-form-urlencoded时,rawbody或data才为空。如果内容类型是application / x-www-form-urlencoded,则rawbody和data将为空。

当调用者将content-type设置为application / x-www-form-urlencoded时,如何获取整个原始请求体(字符串)?

我当前的env是ubuntu 16.04,带有dotnet核心1.1,不知道是否重要

1 个答案:

答案 0 :(得分:2)

ServiceStack使用仅转发请求流,除非您告诉ServiceStack使用预请求过滤器缓冲请求流:

PreRequestFilters.Add((httpReq, httpRes) => {
    httpReq.UseBufferedStream = true;
});

ServiceStack读取或您可以通过让您的请求DTO实施IRequiresRequestStream来告知ServiceStack跳过阅读请求正文以及您将要进入您的服务。

application/x-www-form-urlencoded请求的特殊之处在于,如果访问IRequest.FormData,它将触发读取请求正文。您可以告诉ServiceStack在创建Request with:

时跳过读取FormData
SetConfig(new HostConfig {
    SkipFormDataInCreatingRequest = true
});