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
}
}
}
Code: Select all
public IEnumerable DownloadFile()
{
yield return context.t_noFs.Where(u => u.Id == 1)
.Select(u => u.dat).
FirstOrDefault();
}
Mobile version