8

Próbowałem znaleźć rozwiązanie tego problemu, ale wszystkie nadchodzące są dla poprzednich wersji ASP.Net.Odczytywanie danych postów JSON w ASP.Net Core MVC

pracuję z uwierzytelniania middleware JWT i mają następujące metody:

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

ten pobiera wysyłanych danych, jak gdyby był dane formularzy, ale mój kątowa 2 Czo wysyła dane jako 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) => { 
                 
            }); 
    } 

Moje preferowane rozwiązanie to wysłać jako JSON, ale nie udało mi się odzyskać danych. Wiem, że to wysyła, bo widzę to w skrzypku, a jeśli używam Postmana i po prostu wysyłam dane formularza, to działa dobrze.

Zasadniczo wystarczy, aby dowiedzieć się, jak zmienić tę linię do odczytywania danych json

var username = context.Request.Form["username"]; 
+0

dlaczego nie można po prostu przełączyć funkcję login użyć Content-Type 'application/x-www-form-urlencoded' i właśnie url kodowanie JSON –

+0

bym jak cały z przodu, aby móc wysyłać jsona, zamiast używać json i niektórych danych formularza użycia. Tak naprawdę wypróbowałem tę trasę i trudno było uzyskać prawidłowe dane wysyłane w postaci danych formularzy. Nawet z przykładami nie mogłem zmusić tych dwóch do właściwej rozmowy. – Jhorra

+0

nie możesz po prostu być w stanie to zrobić? 'encodeURIComponent (JSON.stringify ({nazwa użytkownika: nazwa użytkownika, hasło: hasło}));' –

Odpowiedz

7

Zanim dojdzie do swojej middleware strumień prośba została już czytać, więc co można zrobić tutaj jest Microsoft.AspNetCore.Http.Internal.EnableRewind na Zamówienie i czytać sobie szeroki

strony:

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() 
... 
} 

lub selektywny:

private async Task GenerateToken(HttpContext context) 
    { 
    context.Request.EnableRewind(); 
    string jsonData = new StreamReader(context.Request.Body).ReadToEnd(); 
    ... 
    } 
+0

Dlaczego wywołujesz 'EnableRewind' zarówno w twoim oprogramowaniu pośrednim, jak i metodzie" GenerateToken "? –

+0

Dobry punkt @JimAho - edytowany. –

+1

W drugiej opcji należy dodać 'context.Request.Body.Position = 0;' pomiędzy tymi dwoma wierszami. W przeciwnym razie czytnik zwraca pusty ciąg znaków, ponieważ serwer już sam dotarł do końca ciała. –

Powiązane problemy