【问题标题】:DataTables error 500 when waiting for large amount of data等待大量数据时DataTables错误500
【发布时间】:2016-01-20 07:04:21
【问题描述】:

我有一个带有 Knockout.JS 和 Knockout-mapper.js 的 DataTable 实现。我使用 ajax 调用来获取我的数据,它可以很好地处理 5k 条记录。但是当我尝试获取 10 万条记录时,我得到了

Failed to load resource: the server responded with a status of 500 (Internal Server Error)

谁能指出我正确的方向,我怎样才能在我的网格中获取大量数据。

页面:

    <script type="text/javascript">

    $(function () {
            function viewModel(data) {
                var self = this;
                ko.mapping.fromJS(data, {}, self);
            }

            $.ajax({
                url: "@Url.Action("GetRecordsJsonResultAll")", success: function (data) {
                    ko.applyBindings(new viewModel(data));
                    $("#items").DataTable({
                        responsive: true
                    });

                }
            });
        });

</script>

<div class="row">
    <table id="items" class="table table-striped table-hover table-bordered">
        <thead>
            <tr>
                <th>ID</th>
                <th>First name</th>
                <th>Last name</th>
                <th>Email</th>
            </tr>
        </thead>
        <tbody data-bind="foreach: items">
            <tr>
                <td><span data-bind="text: $data.Id"></span></td>
                <td><span data-bind="text: $data.FirstName"></span></td>
                <td><span data-bind="text: $data.LastName"></span></td>
                <td><span data-bind="text: $data.Email"></span></td>
            </tr>
        </tbody>
    </table>
</div>

来自控制器的 JSON 结果(100k 个结果)

public virtual JsonResult GetRecordsJsonResultAll()
    {
        var userBusinessLogic = InterfaceResolver.ResolveWithTransaction<IUserBusinessLogic>();
        var records = userBusinessLogic.GetAll().Select(x => new
        {
            x.Id,
            x.FirstName,
            x.LastName,
            x.Email
        }).OrderBy(i => i.Id);

        var data = Json(new
        {
            max = records.Count(),
            items = records
        }, JsonRequestBehavior.AllowGet);

        return data;
    }

感谢您的帮助。

【问题讨论】:

  • 你检查过json吗?可能有一个特殊字符(如撇号/语音标记)破坏了需要编码的 json,这就是为什么会出现错误而不是结果的数量。
  • 是的,我有 JSON 很好。我有一个相同的函数,它只能得到 1000 个结果,而且它工作没有问题。
  • 您是否检查过错误日志以确定错误的性质。错误 500 表示服务器端发生了故障。理想情况下,您需要某种形式的日志记录,以准确识别诸如这些(您面临的问题)之类的问题。
  • 这不是我得到的唯一错误。数据库需要大约 20 秒才能返回 100.000 个结果,我确实得到了所有项目,它们甚至被发送到查看,但我认为某种超时是问题所在。
  • 这是你web.config中的请求限制大小,你估计json是多长时间?

标签: c# asp.net-mvc knockout.js datatables


【解决方案1】:

您可能已达到MaxJsongLength 限制。尝试将您的操作方法更改为

public virtual ActionResult GetRecordsJsonResultAll()
{
    var userBusinessLogic = InterfaceResolver.ResolveWithTransaction<IUserBusinessLogic>();
    var records = userBusinessLogic.GetAll().Select(x => new
    {
        x.Id,
        x.FirstName,
        x.LastName,
        x.Email
    }).OrderBy(i => i.Id);

    var serializer = new JavaScriptSerializer();
    serializer.MaxJsonLength = Int32.MaxValue;

    var data = new
    {
        max = records.Count(),
        items = records
    };

    var result = new ContentResult
    {
        Content = serializer.Serialize(data),
        ContentType = "application/json"
    };
    return result;

}

此外,使用敲除映射映射100000 记录可能会导致整个网页的用户体验缓慢/无响应。使用分页或按需加载数据。您可以使用

进行测试
function viewModel(data) {
    var self = this;
    console.log(data, "from server")
    self.items = data.items.slice(0,1000);
}

【讨论】:

    猜你喜欢
    • 2019-04-01
    • 2020-03-06
    • 1970-01-01
    • 2018-11-02
    • 2013-07-09
    • 2023-03-13
    • 1970-01-01
    • 2017-12-26
    • 2023-04-03
    相关资源
    最近更新 更多