Getting hold of raw POST data when using [FromBody]

戏子无情 提交于 2019-12-18 08:21:31

问题


I have a controller running on ASP.NET Core 1.0 RC2 and I'd like to dump the raw POST data out to telemetry as ApplicationInsights doesn't do this for you. My code looks like this

[HttpPost]
[Produces("application/json")]
public IActionResult Post([FromBody] RequestClass RequestData)
{
    var stream = this.HttpContext.Request.Body;
    stream.Position = 0;
    using (var reader = new StreamReader(stream))
    {
        string body = reader.ReadToEnd();
        Telemetry.TrackTrace(body, Microsoft.ApplicationInsights.DataContracts.SeverityLevel.Information);
    }
    return Ok();
}

But the string "body" always comes up empty. If I remove the [FromBody] decoration from the function signature, then this code works, but the RequestData object only contains null, which isn't what I want.

The only thing I can think of is converting RequestData back to a Json string, but this feels clunky and slow.

(EDIT: The POST data is Json)


回答1:


You need to enable buffering the request body: services.Configure<FormOptions>(options => options.BufferBody = true); https://github.com/aspnet/HttpAbstractions/blob/dev/src/Microsoft.AspNetCore.Http/Features/FormOptions.cs#L20




回答2:


The most simple way I found to solve this issue is to use jObject as the Model. And send the request with Content-Type: application/json at the header.

Use something like NewtonSoft's json dll this:

[HttpPost]
public IActionResult Post([FromBody] jObject RequestData)
{
    string str = RequestData["key"];
    return Ok();
}

This worked for me




回答3:


The request stream has already been read, so what you can do here is EnableRewind on the Request

See solution here for reading json from body. Same should apply to your issue.



来源:https://stackoverflow.com/questions/37839907/getting-hold-of-raw-post-data-when-using-frombody

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!