Read JSON post data in ASP.Net Core MVC

11,787

By the time it gets to your middleware the request stream has already been read, so what you can do here is Microsoft.AspNetCore.Http.Internal.EnableRewind on the Request and read it yourself

Site wide :

Startup.cs
using Microsoft.AspNetCore.Http.Internal;

Startup.Configure(...){
...
//Its important the rewind us added before UseMvc
app.Use(next => context => { context.Request.EnableRewind(); return next(context); });
app.UseMvc()
...
}

OR selective :

private async Task GenerateToken(HttpContext context)
    {
     context.Request.EnableRewind();
     string jsonData = new StreamReader(context.Request.Body).ReadToEnd();
    ...
    }
Share:
11,787
Suspe18
Author by

Suspe18

Updated on June 14, 2022

Comments

  • Suspe18
    Suspe18 almost 2 years

    I've tried to find a solution for this, but all the ones coming up are for previous versions of ASP.Net.

    I'm working with the JWT authentication middleware and have the following method:

    private async Task GenerateToken(HttpContext context)
    {
        var username = context.Request.Form["username"];
        var password = context.Request.Form["password"];
        //Remainder of login code
    }
    

    This gets the sent data as if it was form data, but my Angular 2 front end is sending the data as JSON.

    login(username: string, password: string): Observable<boolean> {
        let headers = new Headers({ 'Content-Type': 'application/json' });
        let options = new RequestOptions({ headers: headers });
        let body = JSON.stringify({ username: username, password: password });
            return this.http.post(this._api.apiUrl + 'token', body, options)
                .map((response: Response) => {
                    
                });
        }
    

    My preferred solution is to send it as JSON, but I've been unsuccessful in retrieving the data. I know it's sending, because I can see it in fiddler, and if I use Postman and just send form data it works fine.

    Basically I just need to figure out how to change this line to read the json data

    var username = context.Request.Form["username"];
    
  • Jim Aho
    Jim Aho over 6 years
    Why are you calling EnableRewind in both your middleware and in your GenerateToken method?
  • Kevin Kalitowski
    Kevin Kalitowski over 6 years
    With the second option you have to add context.Request.Body.Position = 0; between those two lines. Otherwise the reader returns an empty string because the server had already reached the end of the body on its own.
  • Nathan Zaetta
    Nathan Zaetta over 6 years
    Interesting, I'm using the 2nd option as is and not hitting that issue. Based on net core 1.1
  • ttugates
    ttugates about 6 years
    In .Net Core 2 I had to add context.Request.Body.Position = 0; after the StreamReader otherwise my Post's were getting empty Body.
  • Nikola Markezic
    Nikola Markezic about 3 years
    In ASP.NET Core 5 there is an intentional breaking change to avoid the usage of internal methods. Then new API is EnableBuffering So use context.Request.EnableBuffering(); Instead of context.Request.EnableRewind(); More info: github.com/dotnet/aspnetcore/issues/…