Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting hold of raw POST data when using [FromBody]

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)

like image 364
Iain Brown Avatar asked Jun 15 '16 15:06

Iain Brown


People also ask

What is raw POST data?

If the data is in another format, such as JSON, or if the data doesn't conform to PHP's quirks (such as the rules for having [] on the end of keys with the same name) then you might want to access the data directly so you can parse it yourself. That is the raw POST data.

How do I get a value from the body of a web API post?

Use [FromUri] attribute to force Web API to get the value of complex type from the query string and [FromBody] attribute to get the value of primitive type from the request body, opposite to the default rules. For example, consider the following GET method.

Which is the default formatter for the incoming request body?

In this case you get a the original string back as a JSON response – JSON because the default format for Web API is JSON.

What is FromBody ASP NET core?

[FromBody] attributeThe ASP.NET Core runtime delegates the responsibility of reading the body to an input formatter. Input formatters are explained later in this article.


2 Answers

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

like image 95
Tratcher Avatar answered Oct 26 '22 00:10

Tratcher


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

like image 28
Pini Cheyni Avatar answered Oct 26 '22 01:10

Pini Cheyni