【问题标题】:AspNetCore - Array on QueryString BadRequestAsp Net Core - 查询字符串 BadRequest 上的数组
【发布时间】:2017-07-13 22:14:56
【问题描述】:

我有一个接收字符串的简单 httpGet 端点

[Authorize]
    [HttpGet("filter/{filters}"), Route("filter")]
    public virtual IActionResult Filter(string filters)
    {
        try
        {
            return Ok(Service.GetByFilter(JsonConvert.DeserializeObject<FilterHelper>(filters)));
        }
        catch (Exception ex)
        {
            Logger.LogWarning(LoggingEvents.GET_ENTITY_BY_FILTER, ex, Localizer["EntityGetFilterFailed"]);
            return Ok(new RequestResult(StatusResult.Danger, new Message(string.Format(Localizer["UnexpectedError"], LoggingEvents.GET_ENTITY_BY_FILTER))));
        }
    }

昨天,它工作正常,今天我的电脑在启动时失败并已恢复,之后我的 API 给了我错误的请求结果。

如果我调用这个网址

http://localhost:23272/api/users/filter?filters={"Page":1,"PageSize":5}

请求正确,但如果我尝试调用此 url(之前有效)

http://localhost:23272/api/users/filter?filters={"Page":1,"PageSize":5, "FilterItens": []}

API 向我返回一个 BadRequest 状态 (400)。已经尝试使用一些iten 传递数组,也有错误的请求。

关于如何处理的任何想法?

详细信息:如果我从邮递员那里打电话,它工作正常。

http://localhost:23272/api/users/filter?filters={"Page":1,"PageSize":5, "FilterItens": []}

我的模型

public class FilterHelper
{
    #region Properties
    public int Page { get; set; }
    public int PageSize { get; set; }
    public ICollection<FilterItem> FilterItens { get; set; }
    public string[] Includes { get; set; }
    #endregion
}

【问题讨论】:

  • 由于您没有显示您的模型,因此您更可能有错字 => FilterItens 可能应该是 FilterItems。但请注意,HTTP 没有“数组”的概念,它仅由服务器解释。即?q=1&amp;q=2 只是作为 2 个 q 值发送。它不是一个数组。 ?q[]=1&amp;q[]=2 也一样。只有服务器(即 PHP、.NET、ASP.NET、python、ruby)解释如何处理这个值:?q=1&amp;q=2 可以被视为“只取最后一个”或“只取第一个”或“将多个值视为数组” ”。使用的框架决定,不是 HTTP 规范
  • 这不是一个错字,我将模型作为“字符串”接收,api 在转换之前返回了该错误。用我的模型编辑
  • @Tseng 我正在尝试将 "{"Page":1,"PageSize":5, "FilterItens": []}" 作为字符串发送到我的 API,然后在服务器。如果我用邮递员发送,它可以正常工作,如果我用角度发送,它会坏
  • 首先,查看更新后的评论。其次,只要有=&amp;?,将这样的数据传递给控制器​​就会失败,因为&amp; 被视为参数分隔符,= 被视为参数分配。如果您将参数传递给查询,您总是必须转义它们,尤其是 &amp;= 但是我可以从 Firefox 窗口(在 ASP.NET 中通过 Uri.EscapeDataString(...)。不知道JS 或者如果它在那里也正确转义,您必须查看原始请求而不是 FF 视图
  • 我不会在字符串中包含=,而且,我很伤心,如果我通过邮递员发出 get 它工作正常,我只是不知道为什么它不工作来自我的应用

标签: asp.net-core asp.net-core-webapi


【解决方案1】:

根本问题是:

我的授权令牌对于请求标头来说太大了。

令牌长度约为 16k,并且正在破坏标头。

我对令牌进行了更改,它以 800 长度完成,一切都恢复正常。

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 2021-09-07
    • 2022-09-24
    • 2019-09-16
    • 2020-01-08
    • 2017-04-22
    • 2012-02-13
    • 2020-05-09
    相关资源
    最近更新 更多