【问题标题】:Better method to return Chunks of Data via jQuery, Ajax and ASP.Net通过 jQuery、Ajax 和 ASP.Net 返回数据块的更好方法
【发布时间】:2013-03-08 13:22:21
【问题描述】:

我有一个 ajax 方法,可以根据页面上设置的标准检索数据,这可能是几条记录。我将 ajax 调用更改为一次轮询 25 条记录,而不是返回大型数据集。

我这样做的方式是在我的 WebMethod 上,我根据条件运行 sql,然后将行转换为 JSON 并在第一次轮询时保存到文件中。随后的那些只是从文件加载回类,所以我可以选择下一个 25。我需要在第一次调用时运行一次数据,我不能简单地选择 25,因为该函数需要加载所有记录来执行其他基于它的行动。

我现在的问题是,一个报告返回了一组非常大的数据,该报告引发了错误:使用 JSON JavaScriptSerializer 进行序列化或反序列化期间出错。字符串的长度超过了 maxJsonLength 属性上设置的值。

我已经设置了最大值,所以很明显我需要考虑另一种方法来保存第一次运行的数据并将其分块发送回去,请问有什么想法吗?

编辑: 本质上,我正在寻找一种将类保存到文件并在后续请求中检索它的方法。

【问题讨论】:

  • 查看 asp.net 缓存
  • 你有任何入门链接,因为有很多东西要看。您也可以将其发布为答案吗

标签: jquery asp.net ajax webmethod


【解决方案1】:

我已将 JSON 更改为正常序列化,如下所示:

BinaryFormatter bf = new BinaryFormatter();
FileStream fileStream = new FileStream(System.Web.HttpContext.Current.Server.MapPath("path/data" + model.reportId + ".txt"), FileMode.Create);
bf.Serialize(fileStream, preview);
fileStream.Close();

反序列化:

BinaryFormatter bf = new BinaryFormatter();
FileStream fileStream = new FileStream(System.Web.HttpContext.Current.Server.MapPath("path/data" + model.reportId + ".txt"), FileMode.Open);
fileStream.Seek(0, SeekOrigin.Begin);
DataPreview savedPreview = (DataPreview)bf.Deserialize(fileStream);
fileStream.Close();

【讨论】:

    【解决方案2】:

    在 ASP.NET 中,您可以访问功能强大的cache 对象。

    您可以轻松创建记录集,然后将其添加到缓存中,如下所示:

    HttpContext.Current.Cache.Insert("UniqueidentifierForObject", TheRecordSetObject, Nothing, DateTime.Now.AddHours(2), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, Nothing)
    

    这会将对象插入到缓存中,绝对过期时间为 2 小时。如果你环顾四周,有很多关于缓存的好文档,所以我不会在这里深入探讨。重要的是还要注意缓存是如何访问的,因为在 Web 方法或服务中不会有正常的httpContext,因此您需要使用扩展引用。

    然后在随后的数据调用中,您可以通过调用将对象从缓存中取出:

    Dataset theDataset = HttpContext.Current.Cache("UniqueidentifierForObject");
    if(theDataset == null){
        //CallYour load function because the cahce did not have your object
    }else{
        //Do you pull for the chunk of data.
    }
    

    这样您只需调用一次数据库,即可在需要时从集合中获取记录。

    另外需要注意的是,ASP.NET 在 Web 方法和服务中的序列化方面非常出色。 You don't normally have to serialize or deserialize data that is being passed from and too code behind in web methods and services。它通常是为你完成的,再次尝试可能会导致各种奇怪的行为。

    【讨论】:

      猜你喜欢
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      相关资源
      最近更新 更多