8

이 문제에 대한 해결책을 찾으려고 노력했지만 모든 문제는 이전 버전의 ASP.Net에 대한 것입니다.JSON에서 ASP.Net Core 데이터를 읽으십시오. 코어 MVC

나는 JWT 인증 미들웨어와 협력하고있어 다음과 같은 방법이 있습니다

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

이는 폼 데이터,하지만 것처럼 전송 된 데이터를 얻을 내 코너 2 프론트 엔드는 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) => { 
                 
            }); 
    } 

내 선호하는 솔루션은 JSON으로 전송하는 것이지만 데이터를 가져 오는 데 실패했습니다. 나는 그것이 송신기라는 것을 알고 있습니다, 왜냐하면 나는 그것을 피들러에서 볼 수 있기 때문에, 그리고 제가 우편 배달부를 사용하고 양식 데이터를 보내면 잘 작동합니다.

는 기본적으로 난 그냥 요청 스트림이 이미 읽은는 미들웨어에 도달하는 시간으로 JSON 데이터

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

은 왜 당신이 내가 전체를 원하는 콘텐츠 형식 '을 application/x-www-form-urlencoded' 그냥 URL 인코딩 json으로 –

+0

를 사용하는 기능을 로그인 전환하지 않습니다 프론트 엔드는 json을 사용하는 대신 json을 보낼 수 있고 일부는 양식 데이터를 사용합니다. 나는 실제로이 경로를 시도했지만 데이터를 양식 데이터로 올바르게 전송하는 데 어려움을 겪고있었습니다. 예를 들자면 두 사람이 서로 올바르게 대화 할 수 없었습니다. – Jhorra

+0

이 작업을 수행 할 수 없습니까? 'encodeURIComponent (JSON.stringify ({username : username, password : password})); ' –

답변

7

을 읽는이 줄을 변경하는 방법을 알아낼 필요가 있으므로 여기에 무엇을 할 수 있는지 Microsoft.AspNetCore.Http.Internal.EnableRewind요청에 있으며

사이트 넓은 스스로를 읽어

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

또는 선택적 :

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

미들웨어와 GenerateToken 메소드에서 모두'EnableRewind'를 호출하는 이유는 무엇입니까? –

+0

좋은 지적 @JimAho - 편집 됨. –

+1

두 번째 옵션을 사용하면 두 줄 사이에'context.Request.Body.Position = 0; '을 추가해야합니다. 그렇지 않으면 독자는 서버가 이미 본문의 끝 부분에 도달했기 때문에 빈 문자열을 반환합니다. –

관련 문제