Read JSON post data in ASP.Net Core MVC
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();
...
}
Suspe18
Updated on June 14, 2022Comments
-
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 over 6 yearsWhy are you calling
EnableRewind
in both your middleware and in yourGenerateToken
method? -
Kevin Kalitowski over 6 yearsWith 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 over 6 yearsInteresting, I'm using the 2nd option as is and not hitting that issue. Based on net core 1.1
-
ttugates about 6 yearsIn .Net Core 2 I had to add
context.Request.Body.Position = 0;
after theStreamReader
otherwise my Post's were getting empty Body. -
Nikola Markezic about 3 yearsIn 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/…