Dodatkowo do powyższego linku opisującej konfigurację, można użyć TransmitFile plików „strumień”. Jednak TransmitFile ma trochę wstecz na niektórych klientach HTTP.
To jest mój kod do "strumieniowania" plików do klienta, jako alternatywa dla TransmitFile. Zauważ, że mam mieć config stałą wycofywania z WriteFile (które mają ten sam problem jak ty OutOfMemory): kod
private void RenderContent(string contentType,string fileName, bool inline);
metoda:
FileInfo fi = new FileInfo(fileName);
Response.ClearHeaders();
Response.ClearContent();
Response.ContentType = contentType;
Response.CacheControl = "No-cache";
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
Response.AddHeader("Content-Length", fi.Length.ToString());
Response.AddHeader("Content-Disposition", (inline ? "inline" : "attachment") + "; filename=\"" + fi.Name + "\"");
if (cAppInfos.Constant["FallBackToWriteFile"] != null && cAppInfos.Constant["FallBackToWriteFile"] == "true")
{
Response.WriteFile(fileName);
}
else
{
int chunkSize = 8192;
byte[] buffer = new byte[chunkSize];
int offset = 0;
int read = 0;
using (FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
while ((read = fs.Read(buffer, offset, chunkSize)) > 0)
{
if (!Response.IsClientConnected)
break;
Response.OutputStream.Write(buffer, 0, read);
Response.Flush();
}
}
}
Użyłem tego kodu, aby uniknąć pewnych problemów przesyłanie plików PDF do starej wtyczki programu Acrobat Reader. Dla parametru inline możesz użyć "false".
Dodatkowo, możesz użyć polecenia try/catch wokół tego kodu, ponieważ dowolny z Response.IsClientConnecter/Write/Flush może zgłaszać wyjątki, jeśli klient się rozłączy.
Jednak nie używam MVC i nie jestem pewien, czy jest to akceptowalne dla tego techno, jak gdybyś nie użył TransmitFile, możesz utknąć z tym samym problemem z tym kodem. Jeśli próbujesz osadzić pliki w elemencie stron internetowych (jak może być w przypadku base64?), To nie jest to rozwiązanie.
Daj mi znać więcej informacji na temat Twoich wymagań, jeśli potrzebujesz innych sposobów na osiągnięcie swoich celów.
Dzięki - w przypadku korzystania z łącza, po dodaniu 'GlobalConfiguration.Configuration.Services.Replace (typeof (WebHostBufferPolicySelector), nowe NoBufferPolicySelector());' linię do mojego pliku Global.asax.cs, otrzymuję następujący błąd: 'Typ usługi WebHostBufferPolicySelector nie jest obsługiwany. Czy jest tam jakaś pomoc? –
Pytanie dotyczy MVC, a nie Web API –