【问题标题】:Issue returning larget set of data over Web API通过 Web API 返回大量数据的问题
【发布时间】:2016-08-09 17:19:57
【问题描述】:

我们创建了用于查询 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。 而不是在每个页面请求期间调用 API。在每个初始页面请求上调用 API,在中间层缓存 DB 响应,然后从“本地”缓存中分页。我们可以做上述方法吗?我真的被内存问题困住了,无法继续前进。因为我对 ASP.NET 和 C# 编码非常陌生。非常感谢任何帮助。谢谢

【问题讨论】:

  • 就像 Roman 所说的,让 api 接受页码和可选的页面大小并返回那些特定的记录。添加检查以确保页面大小受到限制(例如不超过 100 条记录)。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2011-01-25
    • 2021-06-15
    相关资源
    最近更新 更多