0

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

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

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

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

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

4

2 回答 2

0

我已将 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();
于 2013-03-08T13:49:00.430 回答
0

在 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 方法和服务中的序列化方面非常出色。您通常不必序列化或反序列化从 web 方法和服务中传递的数据和代码。它通常是为你完成的,再次尝试可能会导致各种奇怪的行为。

于 2013-03-08T14:10:37.983 回答