我有我的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,不知道是否重要
答案 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:
SetConfig(new HostConfig {
SkipFormDataInCreatingRequest = true
});