在 ASP.Net Core MVC 中读取 JSON 发布数据

Posted

技术标签:

【中文标题】在 ASP.Net Core MVC 中读取 JSON 发布数据【英文标题】:Read JSON post data in ASP.Net Core MVC 【发布时间】:2017-07-22 12:41:33 【问题描述】:

我试图为此找到解决方案,但所有即将出现的解决方案都是针对以前版本的 ASP.Net。

我正在使用 JWT 身份验证中间件并有以下方法:

private async Task GenerateToken(HttpContext context)

    var username = context.Request.Form["username"];
    var password = context.Request.Form["password"];
    //Remainder of login code

这会像表单数据一样获取发送的数据,但我的 Angular 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 发送,但我未能成功检索数据。我知道它正在发送,因为我可以在 fiddler 中看到它,并且如果我使用 Postman 并且只发送表单数据,它就可以正常工作。

基本上我只需要弄清楚如何改变这一行来读取json数据

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

【问题讨论】:

你为什么不把你的登录功能切换到使用 Content-Type application/x-www-form-urlencoded 并且只是对 json 进行 url 编码 我希望整个前端能够发送 json,而不是让一些使用 json 和一些使用表单数据。我确实尝试过这条路线,并且很难让数据作为表单数据正确发送。即使有例子,我也无法让两者正确地交谈。 你不应该能够做到这一点吗? encodeURIComponent(JSON.stringify( username: username, password: password )); 不,比这更复杂。 我正在使用 IdentityServer4,据我所知,它做同样的事情,这很烦人,我也更喜欢 json。如果我找到答案,我会告诉你 【参考方案1】:

当它到达你的中间件时,请求流已经被读取,所以你可以在这里做的是Request上的Microsoft.AspNetCore.Http.Internal.EnableRewind strong>并自己阅读

网站范围:

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

【讨论】:

你为什么在你的中间件和GenerateToken方法中都调用EnableRewind 使用第二个选项,您必须在这两行之间添加context.Request.Body.Position = 0;。否则读取器返回一个空字符串,因为服务器已经自行到达正文的末尾。 有趣,我正在使用第二个选项,并没有遇到这个问题。基于net core 1.1 在 .Net Core 2 中,我必须在 StreamReader 之后添加 context.Request.Body.Position = 0;,否则我的帖子会变空。 在 ASP.NET Core 5 中,为了避免使用内部方法,有意进行了重大更改。然后新的 API 是 EnableBuffering 所以使用 context.Request.EnableBuffering();而不是 context.Request.EnableRewind();更多信息:github.com/dotnet/aspnetcore/issues/…

以上是关于在 ASP.Net Core MVC 中读取 JSON 发布数据的主要内容,如果未能解决你的问题,请参考以下文章

菜鸟入门ASP.NET Core5:命令行配置Json文件配置Bind读取配置到C#实例在Core Mvc中使用Options

如何在 ASP.net Core 中添加 js 和 css 文件?

[Asp.Net Core]MVC_Razor布局

[Asp.Net Core]MVC_Razor布局

如何使用 asp.net core mvc 在引导模式中加载 AngularJS 代码

读取解决方案数据文件 ASP.Net Core