Мы создаем веб-API, который принимает массив строк в качестве входного параметра, который запрашивает базу данных oracle и возвращает результат в виде файла JSON.Работа с большими данными JSON, возвращаемыми веб-API
Так что код похож
namespace PDataController.Controllers
{
public class ProvantisDataController : 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))
{
var inconditions = id.Distinct().ToArray();
var srtcon = string.Join(",", inconditions);
DataSet userDataset = new DataSet();
var strQuery = @"SELECT
STCD_PRIO_CATEGORY_DESCR.DESCR AS CATEGORY,
STCD_PRIO_CATEGORY_DESCR.SESSION_NUM AS SESSION_NUMBER,
Trunc(STCD_PRIO_CATEGORY_DESCR.START_DATE) AS SESSION_START_DATE,
STCD_PRIO_CATEGORY_DESCR.START_DATE AS SESSION_START_TIME ,
Trunc(STCD_PRIO_CATEGORY_DESCR.END_DATE) AS SESSION_END_DATE,
FROM
STCD_PRIO_CATEGORY_DESCR,
WHERE
STCD_PRIO_CATEGORY_DESCR.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,OracleDbType.NVarchar2);
p.Value = inconditions[x];
prms.Add(p);
}
if(sb.Length > 0) sb.Length--;
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=ProvantisStudyData.json", out contentDisposition))
{
response.Content.Headers.ContentDisposition = contentDisposition;
}
return response;
}
}
}
}
}
}
Данные, возвращаемые для API в указанном ниже формате
{"data":[{"CATEGORY":"Internal Study","SESSION_NUMBER":7,"SESSION_START_DATE":"2015-02-13T00:00:00","SESSION_START_TIME":"2015-02-13T10:33:59.288394","SESSION_END_DATE":"2015-02-13T00:00:00"}]}
Мы иногда имеющие проблемы в возвращении большого количества данных, которые он бросает OutOfMemory Исключение. Было предложено использовать свойство JSON, параллельное свойству «data»: например, «next_data», со значением значения, которое необходимо передать в SQL OFFSET (который работает в MySQL, я не уверен, что это работает в oracle), если нет данных, то установите значение «next_data» равным 0. Я не уверен, как реализовать это. Не уверен, что это можно реализовать. Любая помощь с этим очень ценится.
Вместо того, чтобы заполнять «DataTable», вы можете напрямую передавать данные из «OracleDataReader» в строках [Сериализация JSON.net непосредственно из oledbconnection] (https://stackoverflow.com/questions/33835729). Конвертеры работают для любого 'IDataReader'. Вы * можете * также периодически обновлять поток ответов, см. [Выход контроллера ASP.NET Web API всегда буферизуется] (http://stackoverflow.com/questions/31487247). См. Также http://www.strathweb.com/2012/09/dealing-with-large-files-in-asp-net-web-api/ – dbc
Можете ли вы дать полный вывод 'ToString()' исключения, включая сообщение, тип исключения, ** traceback ** и внутреннее исключение, если таковые имеются? Это поможет диагностировать, где у вас заканчивается память. – dbc
@dbc Я добавил изображение исключения, которое получаю. Я попытался добавить точки останова в коде, и в коде не было ошибок, но в браузере я вижу ошибку, когда я вставил выше. – user4912134