c#使用JSON序列化大对象

时间:2017-09-28 15:19:50

标签: json asp.net-web-api asp.net-web-api2

我遇到了JSON序列化的大问题。

在我的应用程序中,我使用其中一个Web API控制器定义了以下函数。

[HttpGet]
[ActionName("all")]
[Route("api/customers/all/")]
[SwaggerResponse(HttpStatusCode.InternalServerError, Type = typeof(Models.Response.ResponseError))]
[SwaggerResponse(HttpStatusCode.Forbidden, Type = typeof(Models.Response.ResponseErrorBasic))]
public Models.Response.ResponseApiList<Models.Api.Customer> GetValuesAll(DateTime? since=null)

Models.Api.Customer是一个引用几个相关对象的复杂对象。

public class Customer
{
    public int Id { get;set;}
    public string Name {get;set}
    .....
    public List<Invoices> Invoices {get;set;}
    .....
    ..... 
}

Models.Response.ResponseApiList保存返回的数据

public class ResponseApiList<T>
{
    public ResponseMeta meta { get; set; } // ResponseMeta holds datetime and total records
    public List<T> payload { get; set; }   // Holds the Customer object 
    public ResponseApiList()
    {
        payload = new List<T>();
        meta = new ResponseMeta();
    }

最后,以下是WebApiConfig

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));

已加载NewtonSoft.JSON库,但我不确定要查找它是否正在使用。

无论如何,问题在于性能。目前,要处理的数据库返回大约11,000条记录,但数据的总大小(根据小提琴手通知我的情况)为45Mbs。

当c#代码从函数返回时,所用的总时间约为。 4秒

然后,很长一段时间都没有。今天我在11:43开始了这个过程,它直到15:34才停止。我的测试工具是ReadyAPI(SoapUI)和Insomnia。

最终,这将转换为分页调用以减少发送的数据量,但是从Web API方法发送JSON的限制是什么?

在我进入重新编码路线之前,有没有人有办法以任何其他方式这样做?

1 个答案:

答案 0 :(得分:0)

  1. 首先 - 发送如此可怕的回应(45Mb)是非常奇怪的想法。当这样大的数据对象有用时,我无法发明任何案例。
  2. 如果你有更大的项目集合 - 最好的方法是分页输出。限制/偏移,例如。
  3.   

    最终,这将转换为分页调用以减少发送的数据量,但是从Web API方法发送JSON的限制是什么?

    我认为响应大小没有严格的Web-API级别限制。特别是这个问题与json-serializer无关。此极大响应方案中的限制最有可能出现在Web服务器配置级别上。 (像最大响应大小等等)。

    但是这种情况的主要结论应该是 - &#34;如果json对象是45Mb大 - 出错了。&#34;