发出通过Web API返回大量数据集的问题

时间:2016-08-09 17:19:57

标签: c# asp.net asp.net-mvc asp.net-web-api

我们创建了用于查询Oracle数据库的WebAPI,以JSON格式返回它们。我有以下代码

public class PDataController : ApiController
{
 public HttpResponseMessage Getdetails([FromUri] string[] id)
 {
    List<OracleParameter> prms = new List<OracleParameter>();
    string connStr = ConfigurationManager.ConnectionStrings["PDataConnection"].ConnectionString;
    using (OracleConnection dbconn = new OracleConnection(connStr))
    {
        DataSet userDataset = new DataSet();
        var strQuery = @"SELECT * from STCD_PRIO_CATEGORY where STPR_STUDY.STD_REF IN(";
         StringBuilder sb = new StringBuilder(strQuery);
         for(int x = 0; x < inconditions.Length; x++)
             {
               sb.Append(":p" + x + ",");
               OracleParameter p = new OracleParameter(":p" + x, OracleType.Int32);
               p.Value = inconditions[x];
               prms.Add(p);
             }
        if(sb.Length > 0) sb.Length--;
        strQuery = strQuery + sb.ToString() + ")";
        using (OracleCommand selectCommand = new OracleCommand(strQuery, dbconn))
          {
             selectCommand.Parameters.AddRange(prms.ToArray());
             using (OracleDataAdapter adapter = new OracleDataAdapter(selectCommand))
            {
                DataTable selectResults = new DataTable();
                adapter.Fill(selectResults);
                var returnObject = new { data = selectResults };
                var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json"));
                ContentDispositionHeaderValue contentDisposition = null;
                if (ContentDispositionHeaderValue.TryParse("inline; filename=PStudyData.json", out contentDisposition))
                {
                    response.Content.Headers.ContentDisposition = contentDisposition;
                }
                return response;
            }
        }

    }
}

查询返回巨大的结果,因此有时会抛出OutOfMemoryException。 enter image description here 而不是在每个页面请求期间调用API。在每个初始页面请求上调用API,在中间层缓存数据库响应,然后从该“本地”缓存中分页。可以执行上述方法。我有点陷入内存问题,无法继续前进。因为我是ASP.NET和C#编码的新手。非常感谢你的帮助。谢谢

1 个答案:

答案 0 :(得分:4)

我建议以块的形式实现分页和返回数据。我认为可以肯定地说,如果你的服务器内存不足,你也可能会遇到带宽问题以及接收端的内存问题。