Ich verwende ASP.Net Core WebAPI.In ASP.Net Core, ist es möglich, JSON-Ergebnisse zu streamen?
Ich habe eine Methode, die 10000 Ergebnisse aus der Datenbank zu einem Zeitpunkt abruft, aber ich stelle fest, dass es dauert 1,17 Sekunden auf "warten" und 0,3 Sekunden für die tatsächliche Übertragung (basierend auf dem Netzwerkdiagramm von Chrome).
Mit den Ergebnissen aus der Datenbank (Postgres) werden durch den DataReader iteriert und in eine Struktur konvertiert, zu einer Liste hinzugefügt und schließlich als JsonResult zurückgegeben.
Ich weiß nicht, was genau für Optionen zu erwarten, aber ich möchte in der Lage sein, so bald wie möglich zurückzukehren, um die Gesamtanforderung niedriger zu machen. Ich mache das zum ersten Mal auf dieser Plattform, also mache ich vielleicht nicht die beste Art und Weise.
[HttpGet("{turbine:int}")]
public IActionResult GetBearingTemperature(int turbine)
{
using (var connection = Database.GetConnection())
{
connection.Open();
int? page = GetPage();
var command = connection.CreateCommand();
if (page.HasValue)
{
command.CommandText = @"select turbine, timestamp, mainbearingtemperature from readings where turbine = :turbine limit 10000 offset :offset;";
command.Parameters.AddWithValue("offset", NpgsqlTypes.NpgsqlDbType.Integer, page.Value * 10000);
} else
{
command.CommandText = @"select turbine, timestamp, mainbearingtemperature from readings where turbine = :turbine limit 10000;";
}
command.Parameters.AddWithValue("turbine", NpgsqlTypes.NpgsqlDbType.Integer, 4, turbine);
var reader = command.ExecuteReader();
var collection = new List<BearingTemperature>();
if (reader.HasRows)
{
var bt = new BearingTemperature();
while (reader.Read())
{
bt.Time = reader.GetDateTime(1);
bt.Turbine = reader.GetInt32(0);
bt.Value = reader.GetDouble(2);
collection.Add(bt);
}
return new JsonResult(collection);
}
else
{
return new EmptyResult();
}
}
}
private int? GetPage()
{
if (Request.Query.ContainsKey("page"))
{
return int.Parse(Request.Query["page"]);
}
else return null;
}
struct BearingTemperature
{
public int Turbine;
public DateTime Time;
public double Value;
}
1.17s zu "warten" und 0.3s für die tatsächliche Übertragung von 10.000 Datensätze scheint ziemlich gut zu mir. Ich vermute, dass die meiste Zeit damit verbracht wird, die SQL-Abfrage auszuführen, und dass das Streaming überhaupt keinen Unterschied macht. –
Ich habe gerade einige Ergebnisse von der Protokollierung: Abfrage ausführen @ 538 Iterating @ 565 Antwort @ 591 Diese Ergebnisse zeigen Millisekunden. Ich glaube, ich verstehe nicht, wo die Verzögerung herkommt - es scheint nicht in der Methode selbst zu sein. Das ist alles auf dem lokalen Host - was verursacht das Warten? –