Getting hold of raw POST data when using [FromBody

2020-02-14 02:58发布

问题:

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.