【问题标题】:Larger payload in Ajax Call returning a 302 Status CodeAjax 调用中较大的有效负载返回 302 状态代码
【发布时间】:2017-10-22 20:03:37
【问题描述】:

我希望我的 Edit All 按钮进行 ajax 调用以将 300 个项目发送到我的 jsonresult 控制器方法进行更新,但它根本没有到达我的端点,并且网络选项卡显示状态代码 302。似乎当我尝试发送一个或 10 个项目时,点击我的控制器方法并且工作正常,所以我猜这与 300 太多而无法传递有关?我附上了我的 html + javascript 函数 + ajax 调用 + 控制器方法的一部分。

我查看了其他答案,但它们似乎与登录身份验证或预期 302 的场景有关。还有一些帖子建议一次发送较小的数组,但我想先确定问题是否相关。

$scope.saveAllDays = function () {
                    var newValue = angular.element("#editAll").val(); 
                    var savedCustomers = [];
                    angular.forEach(angular.element(".customer"), function (customer, index) {
                        var currentCustomerId = angular.element(customer).attr("id"); 
                        for (var i = 0; i < $scope.customers.length; i++) { 
                            if ($scope.customers[i].Id == currentCustomerId) {
                                var savedCustomer = $scope.customers[i]; 
                                savedCustomer.ArchiveDays = newValue;
                                savedCustomers.push(savedCustomer);
                                break;
                            }
                        }

                    })
                    console.log(savedCustomers);
                    $.ajax({  
                        type: "PUT",
                        url: "/JobArchive/UpdateArchivePeriods",
                        data: JSON.stringify(savedCustomers),
                        contentType: "application/json",
                        dataType: "json",
                        success: onUpdateAllSuccess, 
                        error: onUpdateAllError
                    })

                }
<div id="archiveConfigTab" class="tab-pane fade">
                <div class="bumper"></div>
                <div class="container cust-body">
                    <div class="search">
                        <label>Search:</label>
                        <input type="text" id="nameInput" size="100" ng-model="customerName" />
                    </div>
                    <div id="customer-title">
                        Customers
                    </div>

                    <div id="editAllDays">
                        <p class="edit-all-btn pull-right">
                            <button class="btn btn-sm btn-default" ng-click="showEditAll($event)">Edit All <i class="fa fa-edit"></i></button>
                        </p>
                        <div class="edit-mode hidden">
                            <input type="number" id="editAll" placeholder="# of days" min="0" />
                            <button class="btn btn-sm btn-primary" ng-click="saveAllDays()">Save</button>
                        </div>
                    </div>

                    <div id="{{customer.Id}}" class="customer" ng-repeat="customer in customers | orderBy : 'Name' | filter : customerName">
                        <p class="cust-row">{{customer.Name}}</p>
                        <p class="cust-row pull-right">
                            <button class="btn btn-sm btn-default" ng-click="toggleInput($event)">edit <i class="fa fa-edit"></i></button>
                        </p>
                        <p>Archive Period: {{customer.ArchiveDays}} days</p>
                        <div class="edit-mode-row hidden">
                            <input type="number" ng-keypress="checkEnter($event, saveDays)" class="archivePeriod" placeholder="# of days" min="0" />
                            <button class="btn btn-primary btn-sm" ng-click="saveDays($event)">save</button>
                        </div>

                    </div>
                </div>
                <div class="bumper"></div>
            </div>
[HttpPut]
    public JsonResult UpdateArchivePeriods(List<LAG.Models.Customer> updatedCustomers)

    {
        List<ConfiguredCustomerViewModel> results = new List<ConfiguredCustomerViewModel>(); // Initialize List of stuff to return to front
        foreach (var customer in updatedCustomers) // Loop through and update each
        {
            bool updateSuccess = LAG.API.DAL.CustomerRepository.GetRepository().SaveArchiveDays(customer.ArchiveDays, customer.Id);
            if (updateSuccess)
            {
                ConfiguredCustomerViewModel result = new ConfiguredCustomerViewModel();
                result.Id = customer.Id;
                result.ArchiveDays = customer.ArchiveDays;
                results.Add(result);
            }
        }
        return Json(results);

    }

【问题讨论】:

  • 在你的 JsonResult 方法中放置一个断点,看看它是否被命中。我敢打赌不是这样,您需要查看其他地方,例如您的 Web 服务器配置,才能找到此错误的来源。
  • 问题 - 这是底部的 c# 代码,对吗?您可能希望使用该标记,因为该代码更接近于发出 302 的任何系统。
  • @TimGrant 我的 JsonResult 方法中确实有一个断点,这就是我知道我的 ajax 调用适用于较小的数组大小但不适用于我想要的全部 300 个的方式。我将尝试修剪我试图传递的对象,看看是否有效。刚刚加了c#标签,谢谢!
  • 好的,这就是证明。当请求有效负载很大时,API Web 服务器上的其他东西会阻止您的代码运行。也许但不一定是因为大请求已损坏。
  • @TimGrant 我修剪了每个对象,只包含我真正需要的两个属性,并且成功进入数据库。我有点担心它不适用于更大的物体,因为我知道我将来可能需要这样做。您是否碰巧知道 Web 服务器是否通常会使用更大的有效负载进行重定向?

标签: javascript c# ajax http-status-code-302 jsonresult


【解决方案1】:

修剪我的对象以仅包含我需要的 2 个属性为我工作。

我仍然很困惑为什么我收到一个 302 试图将我重定向到一个错误页面,尽管因为我传递的数据量并不接近触发 413 状态所需的 5TB代码。真是烦死我了。

【讨论】:

    猜你喜欢
    • 2012-07-29
    • 2013-10-11
    • 1970-01-01
    • 2016-10-02
    • 2018-07-19
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多