【问题标题】:POSTing large collection from Razor page causes ERROR 400从 Razor 页面发布大型集合会导致错误 400
【发布时间】:2021-08-24 16:51:06
【问题描述】:

当我将大量对象(301 个对象)发布回页面处理程序时,出现错误 400。

这是form(为简单起见进行了修剪):

        <form method="post" asp-page-handler="BuildJsonObject" asp-antiforgery="false">

            @{
                int i = 0;

                foreach (var node in Model.FlattenedNodes)
                {
                   <div class="form-inline mt-1">
                        <input type="hidden" name="FlattenedNodes[@i].Key" value="@node.Key" />
                        <input type="hidden" name="FlattenedNodes[@i].ValueKind" value="@node.ValueKind" />
                        <input type="hidden" name="FlattenedNodes[@i].Level" value="@node.Level" />
                        <input type="hidden" name="FlattenedNodes[@i].Key" value="@node.Key" />
                        <input type="hidden" name="FlattenedNodes[@i].ID" value="@node.ID" />
                        <input type="hidden" name="FlattenedNodes[@i].ParentId" value="@node.ParentID" />
                        <input type="text" class="form-control" name="FlattenedNodes[@i].StringValue" value="@node.StringValue" id="@id" />
                            
                    </div>
                    i++;
                }
                <button type="submit" class="btn btn-primary">Save</button>
            }
        </form>

我将IgnoreAntiforgeryToken 属性应用于PageModel,现在错误没有发生,但发布的集合为空。

集合定义:

    [BindProperty]
    public List<TreeNode> FlattenedNodes { get; set; } = new List<TreeNode>();

【问题讨论】:

    标签: c# http asp.net-core razor-pages antiforgerytoken


    【解决方案1】:

    我能够通过将此属性应用于页面模型来绕过这个问题:

    [RequestFormLimits(ValueCountLimit = x)]
    

    我将x设置为int.MaxValue,数据正常发布,但我尝试使用更大的集合(~500个条目),得到了这个异常。

    InvalidOperationException:集合绑定到“FlattenedNodes” 超过 MvcOptions.MaxModelBindingCollectionSize (1024)。这个限制 是防止不正确的模型绑定器和模型的保护措施。地址 “JsonDataTreeVisualizer.TreeNode”中的问题。例如,这种类型 可能具有始终成功的模型绑定器的属性。见 MvcOptions.MaxModelBindingCollectionSize 文档了解更多 信息。

    为了禁用这个安全规则,我在 Startup.ConfigureServices 中添加了这个:

    services.AddMvc(options =>
    {
        options.MaxModelBindingCollectionSize = x;
    });
    

    我再次将x 设置为int.MaxValue。我还需要使用IgnoreAntiforgeryToken

    [RequestFormLimits(ValueCountLimit = int.MaxValue)]
    [IgnoreAntiforgeryToken]
    public class IndexModel : PageModel
    {
        .....
    }
    

    当然,制定这些安全规则是有充分理由的,如上面的异常消息中所述,例如,它可以防止攻击者发布大数据包并导致带宽限制的拒绝服务攻击,但就我而言,我只是在一个爱好项目中使用它。

    【讨论】:

      猜你喜欢
      • 2020-01-01
      • 2018-06-30
      • 2021-11-02
      • 2018-11-06
      • 2016-05-06
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      相关资源
      最近更新 更多