Erstellen Sie eine Get-API, die einen BLOB-.net-Core (EF) zurückgibt.C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Erstellen Sie eine Get-API, die einen BLOB-.net-Core (EF) zurückgibt.

Post by Anonymous »

Ich habe eine Datenbank mit einer Tabelle, die eine ID und ein BLOB hat.
Was ich möchte, ist, den Blob abzurufen und ihn im Wesentlichen an den Client zu streamen,
und ihn nicht im Speicher abzurufen. Das liegt daran, dass der Blob sehr groß sein kann (Hunderte von MB).

Mit SQLdataReader habe ich das fast geschafft.
Wenn ich so eine Get-Anfrage mache, beginnt der Download sofort und es entsteht kein Speicheraufwand. Hierfür wurde .net Core 2.2 verwendet
Als ich jedoch auf .net Core 3.1 umgestiegen bin, funktioniert es jetzt nicht mehr und der Speicher wird mit Hunderten von Megabyte gefüllt. Ich würde das gleiche Ergebnis auch gerne mit dem Entity Framework erzielen, habe aber bisher keine guten Online-Ressourcen gefunden.

Hier ist der Code, den ich bisher habe.

Code: Select all

[HttpGet]
public  IEnumerable GetStreaming()
{

var header = Request.Headers["Accept-Encoding"];
System.Console.WriteLine(header);

string connectionString = "Data Source=myPc\\SQLEXPRESS;Initial Catalog=dbo;Persist Security Info=True;User ID=sa;Password=admin";

//----------------------
SqlConnection connection = new SqlConnection(connectionString);

connection.Open();

SqlCommand command = new SqlCommand("exec getBlob", connection);

SqlTransaction tran = connection.BeginTransaction(IsolationLevel.ReadCommitted);
command.Transaction = tran;
byte[] buffer = new byte[5000000];
long position = 0;
long bytesRead = 5000000;
using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess))
{
reader.Read();
reader.GetBytes(0, position, null, 0, 5000000);
while (bytesRead == 5000000)
{
// Get the pointer for file
bytesRead = reader.GetBytes(0, position, buffer, 0, 5000000);
position += bytesRead;
yield return buffer;

// Create the SqlFileStream

}

}

}
Ich habe es einfach so versucht

Code: Select all

        public  IEnumerable DownloadFile()
{

yield return  context.t_noFs.Where(u => u.Id == 1)
.Select(u => u.dat).
FirstOrDefault();
}
und obwohl dies einen Wert zurückgibt, hat es nicht den gewünschten Effekt und füllt den Speicher.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post