【问题标题】:ASP.NET Core 3.1 is getting an empty bodyASP.NET Core 3.1 的主体是空的
【发布时间】:2020-02-16 15:36:28
【问题描述】:

为了更好地理解,总结了下面的代码,它与 LOCALHOST 完美配合,但是,当我把它放在 IIS 中时,请求的主体总是到达 EMPTY。有人可以帮我吗?

客户端应用代码:

  login(userName: string, password: string): Observable<User> {

    const headers = new HttpHeaders({
      'Content-Type': 'application/json'
    });

    return this.http.post(`${environment.API_URL}/profiles/login`,
      { userName, password }, { headers }
    ).pipe(
      tap((currentUser: User) => {
        this.updateUser(currentUser)
          .then(
            () => {
              console.log('currentUser login stored: ', AppSettings.currentUser);
            },
            error => console.error('Error storing currentUser login', error)
          );
        return AppSettings.currentUser;
      }),
    );
  }

服务器上的 ASP.NET Core 3.1 应用程序代码:

    [Route("api/[controller]")]
    [ApiController]
    public class ProfilesController : ControllerBase
    {
        [HttpPost("login")]
        public async Task<ActionResult> Login(LoginRequest request)
        {
            try
            {
                using (var Reader = new StreamReader(Request.Body, Encoding.UTF8))
                {
                    var sb = new StringBuilder();

                    sb.AppendFormat("ContentType: {0}\n", Request.ContentType);
                    sb.AppendFormat("Request: {0}\n", Request.ToString());
                    sb.AppendFormat("ContentLength: {0}\n", Request.ContentLength.ToString());
                    if (Request.IsHttps)
                        sb.AppendFormat("{0}\n", "HTTPS!");

                    var headers = String.Empty;
                    foreach (var key in Request.Headers)
                        headers += key.Key + "=" + key.Value + Environment.NewLine;
                    sb.AppendFormat("Headers: \n{0}\n", headers);

                    sb.AppendFormat("QueryString: {0}\n", Request.QueryString);

                    var text = await Reader.ReadToEndAsync();
                    sb.AppendFormat("Body: {0}\n", text);
                    return Ok(sb.ToString());
                }
                return Ok("OK");
            }
            catch (System.Exception ex)
            {
                return Unauthorized($"{ex.Message}: {ex.StackTrace}");
            }
        }
    }

请求结果:

ContentType: application/json
Request: Microsoft.AspNetCore.Http.DefaultHttpRequest
ContentLength: 79
Headers: 
Accept=*/*
Accept-Encoding=gzip, deflate, br
Cache-Control=no-cache
Connection=keep-alive
Content-Length=79
Content-Type=application/json
Host=loja.online
User-Agent=PostmanRuntime/7.22.0
Postman-Token=121f1927-c340-492f-a98b-0d6586ff32d8

QueryString: 
Body: 

使用 POSTMAN 会发生同样的事情!

【问题讨论】:

  • 您在 IIS 上托管时是否点击了 Login 方法?
  • 你能检查一下浏览器网络标签的请求是什么吗?另外,LoginRequest是什么?
  • 对不起,在邮递员中我没有这个标签
  • 您能否在 LoginRequest 旁边的 Action 方法中添加 [FromBody] 并重试?
  • 嗨@MarciusBezerra,你收到LoginRequest,它会第一次读取正文,然后你用你的方法再次读取它,所以你的正文是空的。对于多次阅读正文,你可以参考here。你能分享一个可以重现你的问题的样本吗?

标签: asp.net-core webapi


【解决方案1】:

尝试指定来源:

    public async Task<ActionResult> Login([FromBody] LoginRequest request) //Added [FromBody]

Just for Further Details

【讨论】:

  • 谢谢!有效!我只是不明白为什么 [FromBody] 因为我使用的是 ApiController 属性。
  • 有道理。 ApiController 属性只是装饰你的控制器。基本上告诉你的应用这是一个 api 控制器,必须这样对待。
  • 我尝试添加 [FromBody] 属性,但对我不起作用。请问还有什么办法吗?
  • 我能提供帮助的唯一方法就是看到您的代码。因为可能是body没有提交到后端...
  • @RajK 试试[FromForm]。 [FromForm] 和 [FromBody] 都假定 Web 方法的数据将在请求正文中找到。 [FromForm] 最好在数据以表单数据(名称-值对、较旧的 HTML 样式表单)形式到达时使用。 [FromBody] 最好在正文数据以 JSON 格式(通常来自某些 JavaScript 框架)到达时。
猜你喜欢
  • 2020-09-22
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
相关资源
最近更新 更多