IIS7 problem med stora responses
Hej.
Hej!
Vi har ett problem, IIS7 vägrar släppa minne när man skickar stora filer, så varje fil tar lika mycket i minnet som filen är stor, har du några sådana responses igång samtidigt så crashar appen rätt fort.
jag har skrivit lite testkod som efterliknar produktionskoden.. (jag har kommenterat det som skiljer mot prodkoden).
Minnet fylls mycket fortare än vad filen skickas över nätverket så av nån anledning så exekverar
OutputStream.Write(buffer, 0, buffer.Length);
utan att skickar nått, den cachar istället datat och skickar det sedan i den takt som klienten/servern förmår, vilket resulterar i att minnet tar slut.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Threading;
namespace HttpHandlerTest
{
public class FileHandler : IHttpHandler
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
context.Response.Buffer = false;
context.Response.BufferOutput = false;
context.Response.DisableKernelCache();
int buffSize = 8192;
int itterations = 1024 * 500;
int contentLength = buffSize * itterations; //Simulerar en fil på disk på 4 gig.
if (context.Request.UserAgent.Contains("MSIE"))
{
context.Response.AddHeader("Content-Transfer-Encoding", "binary");
}
context.Response.ContentType = "application/octet-stream";
context.Response.AddHeader("Content-Length", contentLength.ToString());
context.Response.AddHeader("Content-disposition", "attachment; filename=" + "tuckel.bin");
var buffer = new byte[buffSize];
Random rand = new Random();
rand.NextBytes(buffer); //Slumpar fram lite binär content.
//Denna for loop ersätter att läsa en fil från disk, istället läser vi samma buffer om och om igen.
for (int i = 0; i < itterations; i++)
{
if (!context.Response.IsClientConnected)
break;
context.Response.OutputStream.Write(buffer, 0, buffer.Length);
context.Response.Flush();
}
context.Response.Close();
}
}
}