将大型JSON数据从C#Web API发送到Javascript客户端

时间:2017-03-23 17:29:18

标签: javascript c# json api server

我对服务器的调用是按以下方式构建的:

  • 我在客户端上有一个callServer函数,用于将数据发送到我的API;
  • 我的API然后从它的控制器接收数据并将其传递给调用数据库的函数;
  • 控制器将响应发送回客户端。

我就是这样做的(这些只是代码的重要部分,而不是一切都在这里):

API(Context.cs):

public static IEnumerable<Dictionary<string, object>> Proc_example(int? value)
    {
        using (NpgsqlConnection conn = new NpgsqlConnection(ConnStr))
        {
            try
            {
                conn.Open();
                using (var cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "proc_example";
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.Parameters.Add(new NpgsqlParameter("value", convertNullValue(value)));

                    var reader = cmd.ExecuteReader();
                    return new DrToDictionary().Serialize(reader);

                }
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                conn.Close();
            }
        }
    }

API(Controller.cs):

[Authorize]

    public JsonResult example(int? value)
    {
        try
        {
            var data = Context.Proc_example(value);

            return Json(new AppServerResult()
            {
                Result = new { list = data }
            }, JsonRequestBehavior.AllowGet);


        }
        catch (Exception e)
        {
            return Json(new AppServerResult()
            {
                HasError = true,
                ErrorMessage = "Houve um erro ao consultar, tente novamente."

            });
        }
    }

客户端(callServer):

app.callServer = function (options, sucessCallback, httpErrCallback, serverErrCallback, operationErrorCallback) {
if (options.source == undefined)
    options.headers = { "Authorization": $.cookie('Token') }

options.success = function (result) {
    try {
        var _result = result;

        if (typeof _result == "string") {
            _result = jQuery.parseJSON(_result);
        }

        if (typeof _result.HasError != "undefined" && _result.HasError) {

            if (!_result.IsValidationError) {
                if (typeof __apiCallerErrorCallback == "function") 
                    __apiCallerErrorCallback(_result.ErrorMessage);

                if (typeof serverErrCallback == "function") {
                    serverErrCallback(_result.ErrorMessage);
                }
            } else {
                app.notifyValidationException(_result.ErrorMessage);                   
            }

        } else {

            if (typeof sucessCallback == "function") {
                if (_result.Result != undefined) sucessCallback(_result.Result);
                else sucessCallback(_result);
            }
        }
    } catch (ex) {

        throw ex;

    }
};

options.error = function (result) {

    if (typeof httpErrCallback == "function") {
        httpErrCallback();
        }
    if (typeof __apiCallerErrorCallback == "function")
        __apiCallerErrorCallback("HTTP Error");
    }

};

jQuery.ajax(options);

};

致电示例:

callingTheServerExample = function (callback, value) {
app.callServer({
    type: "POST",
    url: app.webAPIRootPath + "Controller/example",
    data: "{ 'value':" + JSON.stringify(ko.toJS(value)) + " }",
    contentType: "application/json; charset=utf-8",
    dataType: "json"
}, function (result) {
    if (typeof callback == "function")
        callback(result);
});
}

我的问题是,当我的JSON太大时,我的API在将数据发送回客户端时会给我一个JsonMaxLength异常(异常发生在控制器类上)。我不想将maxJsonLength设置为更高的值。相反,我想找到一种方法从API发送我的JSON,并通过javascript将其挂载到客户端。

有办法吗?

修改

我忘了添加细节:我正在使用REST API。如下面的评论中所述,分页是一种解决方案,但我需要的是让整个记录集立即可用。可以使用分页来实现它,但它似乎更慢并且会导致更多的API调用。 Streaming似乎是一种解决方案,但我之前从未这样做过,我无法弄清楚如何实现它。

编辑2:

我已经像这样实现了我的分页:

         public JsonResult example(int? value, int page)
    {
        try
        {
            var data = Context.Proc_example(value, page);

            if (pPage > 0)
            {
                var pagedResult = data.Skip((page - 1) * 20).Take(20).ToList();

                return Json(new AppServerResult()
                {
                    Result = new { list = data}
                }, JsonRequestBehavior.AllowGet);
            }
            else
            {
                return Json(new AppServerResult()
                {
                    Result = new { list = data}
                }, JsonRequestBehavior.AllowGet);
            }

        }
        catch (Exception e)
        {
            return Json(new AppServerResult()
            {
                HasError = true,
                ErrorMessage = "Houve um erro ao consultar, tente novamente."

            });
        }
    }

但我仍然没有实现我想要的目标。有人会想到一个更好的方法吗?

1 个答案:

答案 0 :(得分:0)

用于JsonMaxLength异常

尝试

写入web.config

<system.web.extensions>
<scripting>
  <webServices>
    <jsonSerialization maxJsonLength="1000000">
    </jsonSerialization>
  </webServices>
</scripting>
</system.web.extensions>

默认情况下,maxJsonLength为102400。